1<?php declare(strict_types=1);
2
3namespace PhpParser\Node\Scalar;
4
5use PhpParser\Node\Scalar;
6
7class Float_ extends Scalar {
8    /** @var float Number value */
9    public float $value;
10
11    /**
12     * Constructs a float number scalar node.
13     *
14     * @param float $value Value of the number
15     * @param array<string, mixed> $attributes Additional attributes
16     */
17    public function __construct(float $value, array $attributes = []) {
18        $this->attributes = $attributes;
19        $this->value = $value;
20    }
21
22    public function getSubNodeNames(): array {
23        return ['value'];
24    }
25
26    /**
27     * @param mixed[] $attributes
28     */
29    public static function fromString(string $str, array $attributes = []): Float_ {
30        $attributes['rawValue'] = $str;
31        $float = self::parse($str);
32
33        return new Float_($float, $attributes);
34    }
35
36    /**
37     * @internal
38     *
39     * Parses a DNUMBER token like PHP would.
40     *
41     * @param string $str A string number
42     *
43     * @return float The parsed number
44     */
45    public static function parse(string $str): float {
46        $str = str_replace('_', '', $str);
47
48        // Check whether this is one of the special integer notations.
49        if ('0' === $str[0]) {
50            // hex
51            if ('x' === $str[1] || 'X' === $str[1]) {
52                return hexdec($str);
53            }
54
55            // bin
56            if ('b' === $str[1] || 'B' === $str[1]) {
57                return bindec($str);
58            }
59
60            // oct, but only if the string does not contain any of '.eE'.
61            if (false === strpbrk($str, '.eE')) {
62                // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit
63                // (8 or 9) so that only the digits before that are used.
64                return octdec(substr($str, 0, strcspn($str, '89')));
65            }
66        }
67
68        // dec
69        return (float) $str;
70    }
71
72    public function getType(): string {
73        return 'Scalar_Float';
74    }
75}
76
77// @deprecated compatibility alias
78class_alias(Float_::class, DNumber::class);
79