Skip to content

Commit 2827324

Browse files
committed
Bug#59597 NumberFormatter::parse() with TYPE_INT64 results in a 32 bit integer
1 parent 4650b21 commit 2827324

File tree

2 files changed

+21
-3
lines changed

2 files changed

+21
-3
lines changed

ext/intl/formatter/formatter_parse.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,10 @@ PHP_FUNCTION( numfmt_parse )
8383
break;
8484
case FORMAT_TYPE_INT64:
8585
val64 = unum_parseInt64(FORMATTER_OBJECT(nfo), sstr, sstr_len, position_p, &INTL_DATA_ERROR_CODE(nfo));
86-
if(val64 > LONG_MAX || val64 < -LONG_MAX) {
86+
if(val64 > LONG_MAX || val64 < LONG_MIN) {
8787
RETVAL_DOUBLE(val64);
8888
} else {
89-
val32 = (int32_t)val64;
90-
RETVAL_LONG(val32);
89+
RETVAL_LONG((long)val64);
9190
}
9291
break;
9392
case FORMAT_TYPE_DOUBLE:

ext/intl/tests/bug59597.phpt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
Bug#59597 NumberFormatter::parse() with TYPE_INT64 results in a 32 bit integer
3+
--SKIPIF--
4+
<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
5+
--FILE--
6+
<?php
7+
8+
$formatter = new \NumberFormatter('en', \NumberFormatter::DECIMAL);
9+
$value = $formatter->parse('2147483647', \NumberFormatter::TYPE_INT32);
10+
var_dump($value);
11+
12+
$formatter = new \NumberFormatter('en', \NumberFormatter::DECIMAL);
13+
$value = $formatter->parse('2147483650', \NumberFormatter::TYPE_INT64);
14+
var_dump($value);
15+
16+
?>
17+
--EXPECTF--
18+
int(2147483647)
19+
int(2147483650)

0 commit comments

Comments
 (0)