22
33namespace PostScripton \Money ;
44
5+ use PostScripton \Money \Exceptions \NotNumericException ;
6+ use PostScripton \Money \Exceptions \UndefinedOriginException ;
57use PostScripton \Money \Traits \MoneyFormatter ;
68use PostScripton \Money \Traits \MoneyStatic ;
79
@@ -45,8 +47,8 @@ public function getPureNumber(): float
4547 public function getNumber (): string
4648 {
4749 $ amount = $ this ->settings ->getOrigin () === MoneySettings::ORIGIN_INT
48- ? (float )($ this ->number / $ this ->getDivisor ())
49- : $ this ->number ;
50+ ? (float )($ this ->getPureNumber () / $ this ->getDivisor ())
51+ : $ this ->getPureNumber () ;
5052
5153 $ money = number_format (
5254 $ amount ,
@@ -67,6 +69,67 @@ public function getNumber(): string
6769 return $ money ;
6870 }
6971
72+ public function add ($ number , int $ origin = MoneySettings::ORIGIN_INT ): Money
73+ {
74+ // Error handlers
75+ if (!is_numeric ($ number )) {
76+ throw new NotNumericException (__METHOD__ , 1 , '$number ' );
77+ }
78+ if (!in_array ($ origin , MoneySettings::ORIGINS )) {
79+ throw new UndefinedOriginException (__METHOD__ , 2 , '$origin ' );
80+ }
81+
82+ $ this ->number += $ this ->numberIntoCorrectOrigin ($ number , $ origin );
83+ return $ this ;
84+ }
85+
86+ public function subtract ($ number , int $ origin = MoneySettings::ORIGIN_INT ): Money
87+ {
88+ // Error handlers
89+ if (!is_numeric ($ number )) {
90+ throw new NotNumericException (__METHOD__ , 1 , '$number ' );
91+ }
92+ if (!in_array ($ origin , MoneySettings::ORIGINS )) {
93+ throw new UndefinedOriginException (__METHOD__ , 2 , '$origin ' );
94+ }
95+
96+ $ number = $ this ->numberIntoCorrectOrigin ($ number , $ origin );
97+
98+ // If less than 0, then result must be 0
99+ if ($ this ->getPureNumber () - $ number < 0 ) {
100+ $ number = $ this ->getPureNumber ();
101+ }
102+
103+ $ this ->number -= $ number ;
104+ return $ this ;
105+ }
106+
107+ public function rebase ($ number , int $ origin = MoneySettings::ORIGIN_INT ): Money
108+ {
109+ // Error handlers
110+ if (!is_numeric ($ number )) {
111+ throw new NotNumericException (__METHOD__ , 1 , '$number ' );
112+ }
113+ if (!in_array ($ origin , MoneySettings::ORIGINS )) {
114+ throw new UndefinedOriginException (__METHOD__ , 2 , '$origin ' );
115+ }
116+
117+ $ this ->number = $ this ->numberIntoCorrectOrigin ($ number , $ origin );
118+ return $ this ;
119+ }
120+
121+ private function numberIntoCorrectOrigin ($ number , int $ origin = MoneySettings::ORIGIN_INT )
122+ {
123+ // If origins are not the same
124+ if ($ this ->settings ->getOrigin () !== $ origin ) {
125+ return $ this ->settings ->getOrigin () === MoneySettings::ORIGIN_INT
126+ ? floor ($ number * $ this ->getDivisor ()) // $origin is float
127+ : $ number / $ this ->getDivisor (); // $origin is int
128+ }
129+
130+ return $ number ;
131+ }
132+
70133 public function convertOfflineInto (Currency $ currency , float $ coeff ): Money
71134 {
72135 $ new_amount = $ this ->getPureNumber () * $ coeff ;
0 commit comments