Skip to content

Commit 4597c12

Browse files
committed
[Yaml] Allow using _ in some numeric notations
1 parent 0b67fa3 commit 4597c12

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

src/Symfony/Component/Yaml/Inline.php

+8-3
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ public static function dump($value, $flags = 0)
206206
case Escaper::requiresDoubleQuoting($value):
207207
return Escaper::escapeWithDoubleQuotes($value);
208208
case Escaper::requiresSingleQuoting($value):
209+
case preg_match('{^[0-9]+[_0-9]*$}', $value):
209210
case preg_match(self::getHexRegex(), $value):
210211
case preg_match(self::getTimestampRegex(), $value):
211212
return Escaper::escapeWithSingleQuotes($value);
@@ -564,6 +565,8 @@ private static function evaluateScalar($scalar, $flags, $references = array())
564565
return;
565566
case 0 === strpos($scalar, '!!float '):
566567
return (float) substr($scalar, 8);
568+
case preg_match('{^[+-]?[0-9][0-9_]*$}', $scalar):
569+
$scalar = str_replace('_', '', (string) $scalar);
567570
case ctype_digit($scalar):
568571
$raw = $scalar;
569572
$cast = (int) $scalar;
@@ -576,6 +579,8 @@ private static function evaluateScalar($scalar, $flags, $references = array())
576579
return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw === (string) $cast) ? $cast : $raw);
577580
case is_numeric($scalar):
578581
case preg_match(self::getHexRegex(), $scalar):
582+
$scalar = str_replace('_', '', $scalar);
583+
579584
return '0x' === $scalar[0].$scalar[1] ? hexdec($scalar) : (float) $scalar;
580585
case '.inf' === $scalarLower:
581586
case '.nan' === $scalarLower:
@@ -584,8 +589,8 @@ private static function evaluateScalar($scalar, $flags, $references = array())
584589
return log(0);
585590
case 0 === strpos($scalar, '!!binary '):
586591
return self::evaluateBinaryScalar(substr($scalar, 9));
587-
case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar):
588-
return (float) str_replace(',', '', $scalar);
592+
case preg_match('/^(-|\+)?[0-9][0-9,_]*(\.[0-9_]+)?$/', $scalar):
593+
return (float) str_replace(array(',', '_'), '', $scalar);
589594
case preg_match(self::getTimestampRegex(), $scalar):
590595
if (Yaml::PARSE_DATETIME & $flags) {
591596
return new \DateTime($scalar, new \DateTimeZone('UTC'));
@@ -662,6 +667,6 @@ private static function getTimestampRegex()
662667
*/
663668
private static function getHexRegex()
664669
{
665-
return '~^0x[0-9a-f]++$~i';
670+
return '~^0x[0-9a-f_]++$~i';
666671
}
667672
}

src/Symfony/Component/Yaml/Tests/InlineTest.php

+10
Original file line numberDiff line numberDiff line change
@@ -286,11 +286,16 @@ public function getTestsForParse()
286286
array('true', true),
287287
array('12', 12),
288288
array('-12', -12),
289+
array('1_2', 12),
290+
array('_12', '_12'),
291+
array('12_', 12),
289292
array('"quoted string"', 'quoted string'),
290293
array("'quoted string'", 'quoted string'),
291294
array('12.30e+02', 12.30e+02),
292295
array('0x4D2', 0x4D2),
296+
array('0x_4_D_2_', 0x4D2),
293297
array('02333', 02333),
298+
array('0_2_3_3_3', 02333),
294299
array('.Inf', -log(0)),
295300
array('-.Inf', log(0)),
296301
array("'686e444'", '686e444'),
@@ -438,10 +443,15 @@ public function getTestsForDump()
438443
array('false', false),
439444
array('true', true),
440445
array('12', 12),
446+
array("'1_2'", '1_2'),
447+
array('_12', '_12'),
448+
array("'12_'", '12_'),
441449
array("'quoted string'", 'quoted string'),
442450
array('!!float 1230', 12.30e+02),
443451
array('1234', 0x4D2),
444452
array('1243', 02333),
453+
array("'0x_4_D_2_'", '0x_4_D_2_'),
454+
array("'0_2_3_3_3'", '0_2_3_3_3'),
445455
array('.Inf', -log(0)),
446456
array('-.Inf', log(0)),
447457
array("'686e444'", '686e444'),

0 commit comments

Comments
 (0)