comparison vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:c75dbcec494b
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 parent::__construct($attributes);
20 $this->value = $value;
21 }
22
23 public function getSubNodeNames() : array {
24 return ['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(string $str) : float {
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
65 public function getType() : string {
66 return 'Scalar_DNumber';
67 }
68 }