[PHP-NOTES] note 130292 added to bcmath-number.construct

[email protected] ("[email protected]")
Newsgroups php.notes
Message-ID <[email protected]>
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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.