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

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 5fb285c0d0e3
comparison
equal deleted inserted replaced
-1:000000000000 0:4c8ae668cc8c
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 }