Subversion-Projekte lars-tiefland.laravel_shop

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

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