84ef75d34bec48707dfa697eabb3919f38f242c5
[yaffs-website] / vendor / nikic / php-parser / lib / PhpParser / Node / Scalar / DNumber.php
1 <?php
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($value, array $attributes = array()) {
19         parent::__construct($attributes);
20         $this->value = $value;
21     }
22
23     public function getSubNodeNames() {
24         return array('value');
25     }
26
27     /**
28      * @internal
29      *
30      * Parses a DNUMBER token like PHP would.
31      *
32      * @param string $str A string number
33      *
34      * @return float The parsed number
35      */
36     public static function parse($str) {
37         // if string contains any of .eE just cast it to float
38         if (false !== strpbrk($str, '.eE')) {
39             return (float) $str;
40         }
41
42         // otherwise it's an integer notation that overflowed into a float
43         // if it starts with 0 it's one of the special integer notations
44         if ('0' === $str[0]) {
45             // hex
46             if ('x' === $str[1] || 'X' === $str[1]) {
47                 return hexdec($str);
48             }
49
50             // bin
51             if ('b' === $str[1] || 'B' === $str[1]) {
52                 return bindec($str);
53             }
54
55             // oct
56             // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit (8 or 9)
57             // so that only the digits before that are used
58             return octdec(substr($str, 0, strcspn($str, '89')));
59         }
60
61         // dec
62         return (float) $str;
63     }
64 }