BcMath\Number::__construct

(PHP 8 >= 8.4.0)

BcMath\Number::__construct β€” Π‘ΠΎΠ·Π΄Π°Ρ‘Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ BcMath\Number

ОписаниС

public function BcMath\Number::__construct(string|int $num)

ΠœΠ΅Ρ‚ΠΎΠ΄ создаёт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса BcMath\Number ΠΈΠ· значСния с Ρ‚ΠΈΠΏΠΎΠΌ int ΠΈΠ»ΠΈ string.

Бписок ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²

num
ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Ρ‚ΠΈΠΏΡƒ int ΠΈΠ»ΠΈ string. ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ num Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° с Ρ‚ΠΈΠΏΠΎΠΌ int ΠΌΠ΅Ρ‚ΠΎΠ΄ устанавливаСт для свойства BcMath\Number::scale Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0. Π’ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ с Ρ‚ΠΈΠΏΠΎΠΌ string ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ num ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ допустимыС числа, ΠΏΡ€ΠΈ этом Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для свойства BcMath\Number::scale ΠΌΠ΅Ρ‚ΠΎΠ΄ устанавливаСт автоматичСски ΠΏΡƒΡ‚Ρ‘ΠΌ Ρ€Π°Π·Π±ΠΎΡ€Π° строки.

Ошибки

ΠœΠ΅Ρ‚ΠΎΠ΄ выбрасываСт ΠΎΡˆΠΈΠ±ΠΊΡƒ ValueError, Ссли Π² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π΅ num ΠΏΠ΅Ρ€Π΅Π΄Π°Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Ρ‚ΠΈΠΏΠΎΠΌ string, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ сформировали Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния допустимого Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° числовых строк Π² ΠΌΠΎΠ΄ΡƒΠ»Π΅ BCMath.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ #1 ΠŸΡ€ΠΈΠΌΠ΅Ρ€ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° числа ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ BcMath\Number::__construct()

<?php

$num1
= new BcMath\Number(100);
$num2 = new BcMath\Number('-200');
$num3 = new BcMath\Number('300.00');

var_dump($num1, $num2, $num3);

?>

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°:

object(BcMath\Number)#1 (2) {
  ["value"]=>
  string(3) "100"
  ["scale"]=>
  int(0)
}
object(BcMath\Number)#2 (2) {
  ["value"]=>
  string(4) "-200"
  ["scale"]=>
  int(0)
}
object(BcMath\Number)#3 (2) {
  ["value"]=>
  string(6) "300.00"
  ["scale"]=>
  int(2)
}

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅

οΌ‹Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ 1 note

up
0
gajowy at agzeta dot pl ΒΆ
1 year ago
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)
}