diff options
Diffstat (limited to 'vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php')
-rw-r--r-- | vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php new file mode 100644 index 0000000..84ef75d --- /dev/null +++ b/vendor/nikic/php-parser/lib/PhpParser/Node/Scalar/DNumber.php @@ -0,0 +1,64 @@ +<?php + +namespace PhpParser\Node\Scalar; + +use PhpParser\Node\Scalar; + +class DNumber extends Scalar +{ + /** @var float Number value */ + public $value; + + /** + * Constructs a float number scalar node. + * + * @param float $value Value of the number + * @param array $attributes Additional attributes + */ + public function __construct($value, array $attributes = array()) { + parent::__construct($attributes); + $this->value = $value; + } + + public function getSubNodeNames() { + return array('value'); + } + + /** + * @internal + * + * Parses a DNUMBER token like PHP would. + * + * @param string $str A string number + * + * @return float The parsed number + */ + public static function parse($str) { + // if string contains any of .eE just cast it to float + if (false !== strpbrk($str, '.eE')) { + return (float) $str; + } + + // otherwise it's an integer notation that overflowed into a float + // if it starts with 0 it's one of the special integer notations + if ('0' === $str[0]) { + // hex + if ('x' === $str[1] || 'X' === $str[1]) { + return hexdec($str); + } + + // bin + if ('b' === $str[1] || 'B' === $str[1]) { + return bindec($str); + } + + // oct + // substr($str, 0, strcspn($str, '89')) cuts the string at the first invalid digit (8 or 9) + // so that only the digits before that are used + return octdec(substr($str, 0, strcspn($str, '89'))); + } + + // dec + return (float) $str; + } +} |