note 130292 added to bcmath-number.construct

From: Date: Tue, 13 May 2025 09:05:23 +0000
Subject: note 130292 added to bcmath-number.construct
Groups: php.notes 
Request: Send a blank email to php-notes+get-222139@lists.php.net to get a copy of this message
It seems that the constructor does not accept values ​​in the scientific format, e.g. "1e20". To get around this limitation, I wrote a function that converts floats represented by a scientific format string to floats represented by a string as a decimal fractional number. You can use the output of this function as the input to the constructor. <?php use BCMath\Number; $num = -123e-40; // can be a float or string variable, because... $strNum = sci2dec( $num ); // ...there is an internal float to string conversion $L = new Number( $strNum ); var_dump( $L ); function sci2dec( string $s ): string { if( !preg_match( '/^([+-]?)(\d+(?:\.\d+)?)[eE]([+-]?\d+)$/', $s, $m ) ) return $s; // it's not sci format, return unchanged [ $sign, $mantissa, $exp ] = [ $m[1], $m[2], (int)$m[3] ]; [ $int, $frac ] = str_contains( $mantissa, '.' ) ? explode( '.', $mantissa, 2 ) : [ $mantissa, '' ]; $digits = $int . $frac; $exp -= strLen( $frac ); if( $exp >= 0 ) { $digits .= str_repeat('0', $exp); $dec = lTrim($digits, '0'); return $sign . ( $dec === '' ? '0' : $dec ); } $pos = strLen( $digits ) + $exp; if( $pos > 0 ) // kropka w środku return $sign . subStr( $digits, 0, $pos ) . '.' . subStr( $digits, $pos ); return $sign . '0.' . str_repeat( '0', -$pos ) . $digits; } ?> Output is: object(BcMath\Number)#2 (2) { ["value"]=> string(43) "-0.0000000000000000000000000000000000000123" ["scale"]=> int(40) } ---- Server IP: 45.112.84.4 Probable Submitter: 80.90.5.137 (proxied: 193.142.112.99) ---- Manual Page -- https://php.net/manual/en/bcmath-number.construct.php Edit -- https://main.php.net/note/edit/130292 Del: integrated -- https://main.php.net/note/delete/130292/integrated Del: useless -- https://main.php.net/note/delete/130292/useless Del: bad code -- https://main.php.net/note/delete/130292/bad+code Del: spam -- https://main.php.net/note/delete/130292/spam Del: non-english -- https://main.php.net/note/delete/130292/non-english Del: in docs -- https://main.php.net/note/delete/130292/in+docs Del: other reasons-- https://main.php.net/note/delete/130292 Reject -- https://main.php.net/note/reject/130292 Search -- https://main.php.net/manage/user-notes.php

« previous php.notes (#222139) next »