@@ -26,6 +26,8 @@ final class Calculator
2626 */
2727 public static function add (string $ first_number , string $ second_number , int $ scale = 6 ): string
2828 {
29+ self ::assertNumberFormat ($ first_number );
30+ self ::assertNumberFormat ($ second_number );
2931 $ result = bcadd ($ first_number , $ second_number , $ scale );
3032
3133 return self ::trim ($ result );
@@ -44,6 +46,8 @@ public static function add(string $first_number, string $second_number, int $sca
4446 */
4547 public static function subtract (string $ first_number , string $ second_number , int $ scale = 6 ): string
4648 {
49+ self ::assertNumberFormat ($ first_number );
50+ self ::assertNumberFormat ($ second_number );
4751 $ result = bcsub ($ first_number , $ second_number , $ scale );
4852
4953 return self ::trim ($ result );
@@ -62,6 +66,8 @@ public static function subtract(string $first_number, string $second_number, int
6266 */
6367 public static function multiply (string $ first_number , string $ second_number , int $ scale = 6 ): string
6468 {
69+ self ::assertNumberFormat ($ first_number );
70+ self ::assertNumberFormat ($ second_number );
6571 $ result = bcmul ($ first_number , $ second_number , $ scale );
6672
6773 return self ::trim ($ result );
@@ -80,6 +86,8 @@ public static function multiply(string $first_number, string $second_number, int
8086 */
8187 public static function divide (string $ first_number , string $ second_number , int $ scale = 6 ): string
8288 {
89+ self ::assertNumberFormat ($ first_number );
90+ self ::assertNumberFormat ($ second_number );
8391 $ result = bcdiv ($ first_number , $ second_number , $ scale );
8492
8593 return self ::trim ($ result );
@@ -139,6 +147,7 @@ public static function floor(string $number): string
139147 */
140148 public static function round (string $ number , int $ precision = 0 , int $ mode = PHP_ROUND_HALF_UP ): string
141149 {
150+ self ::assertNumberFormat ($ number );
142151 if (!is_numeric ($ precision ) || $ precision < 0 ) {
143152 throw new \InvalidArgumentException ('The provided precision should be a positive number ' );
144153 }
@@ -154,7 +163,7 @@ public static function round(string $number, int $precision = 0, int $mode = PHP
154163 // The rounding direction is based on the first decimal after $precision.
155164 $ number_parts = explode ('. ' , $ number );
156165 $ decimals = !empty ($ number_parts [1 ]) ? $ number_parts [1 ] : '0 ' ;
157- $ relevant_decimal = isset ( $ decimals [$ precision ]) ? $ decimals [ $ precision ] : 0 ;
166+ $ relevant_decimal = $ decimals [$ precision ] ?? 0 ;
158167 if ($ relevant_decimal < 5 ) {
159168 $ number = $ rounded_down ;
160169 } elseif ($ relevant_decimal == 5 ) {
@@ -190,6 +199,8 @@ public static function round(string $number, int $precision = 0, int $mode = PHP
190199 */
191200 public static function compare (string $ first_number , string $ second_number , int $ scale = 6 ): int
192201 {
202+ self ::assertNumberFormat ($ first_number );
203+ self ::assertNumberFormat ($ second_number );
193204 return bccomp ($ first_number , $ second_number , $ scale );
194205 }
195206
@@ -216,4 +227,18 @@ public static function trim(string $number): string
216227 return $ number ;
217228 }
218229
230+ /**
231+ * Assert that the given number is a numeric string value.
232+ *
233+ * @param string $number The number to check.
234+ *
235+ * @throws \InvalidArgumentException
236+ */
237+ public static function assertNumberFormat (string $ number )
238+ {
239+ if (!is_numeric ($ number )) {
240+ throw new \InvalidArgumentException (sprintf ('The provided value "%s" is not a numeric value. ' , $ number ));
241+ }
242+ }
243+
219244}
0 commit comments