@@ -206,6 +206,7 @@ public static function dump($value, $flags = 0)
206
206
case Escaper::requiresDoubleQuoting ($ value ):
207
207
return Escaper::escapeWithDoubleQuotes ($ value );
208
208
case Escaper::requiresSingleQuoting ($ value ):
209
+ case preg_match ('{^[0-9]+[_0-9]*$} ' , $ value ):
209
210
case preg_match (self ::getHexRegex (), $ value ):
210
211
case preg_match (self ::getTimestampRegex (), $ value ):
211
212
return Escaper::escapeWithSingleQuotes ($ value );
@@ -564,6 +565,9 @@ private static function evaluateScalar($scalar, $flags, $references = array())
564
565
return ;
565
566
case 0 === strpos ($ scalar , '!!float ' ):
566
567
return (float ) substr ($ scalar , 8 );
568
+ case preg_match ('{^[+-]?[0-9][0-9_]*$} ' , $ scalar ):
569
+ $ scalar = str_replace ('_ ' , '' , (string ) $ scalar );
570
+ // omitting the break / return as integers are handled in the next case
567
571
case ctype_digit ($ scalar ):
568
572
$ raw = $ scalar ;
569
573
$ cast = (int ) $ scalar ;
@@ -576,6 +580,8 @@ private static function evaluateScalar($scalar, $flags, $references = array())
576
580
return '0 ' == $ scalar [1 ] ? octdec ($ scalar ) : (((string ) $ raw === (string ) $ cast ) ? $ cast : $ raw );
577
581
case is_numeric ($ scalar ):
578
582
case preg_match (self ::getHexRegex (), $ scalar ):
583
+ $ scalar = str_replace ('_ ' , '' , $ scalar );
584
+
579
585
return '0x ' === $ scalar [0 ].$ scalar [1 ] ? hexdec ($ scalar ) : (float ) $ scalar ;
580
586
case '.inf ' === $ scalarLower :
581
587
case '.nan ' === $ scalarLower :
@@ -584,8 +590,8 @@ private static function evaluateScalar($scalar, $flags, $references = array())
584
590
return log (0 );
585
591
case 0 === strpos ($ scalar , '!!binary ' ):
586
592
return self ::evaluateBinaryScalar (substr ($ scalar , 9 ));
587
- case preg_match ('/^(-|\+)?[0-9,]+ (\.[0-9 ]+)?$/ ' , $ scalar ):
588
- return (float ) str_replace (', ' , '' , $ scalar );
593
+ case preg_match ('/^(-|\+)?[0-9][0-9,_]* (\.[0-9_ ]+)?$/ ' , $ scalar ):
594
+ return (float ) str_replace (array ( ', ' , ' _ ' ) , '' , $ scalar );
589
595
case preg_match (self ::getTimestampRegex (), $ scalar ):
590
596
if (Yaml::PARSE_DATETIME & $ flags ) {
591
597
return new \DateTime ($ scalar , new \DateTimeZone ('UTC ' ));
@@ -662,6 +668,6 @@ private static function getTimestampRegex()
662
668
*/
663
669
private static function getHexRegex ()
664
670
{
665
- return '~^0x[0-9a-f ]++$~i ' ;
671
+ return '~^0x[0-9a-f_ ]++$~i ' ;
666
672
}
667
673
}
0 commit comments