diff --git a/ext/intl/formatter/formatter_parse.c b/ext/intl/formatter/formatter_parse.c index cbdde855dece8..6f3a3a12b5b7a 100755 --- a/ext/intl/formatter/formatter_parse.c +++ b/ext/intl/formatter/formatter_parse.c @@ -83,11 +83,10 @@ PHP_FUNCTION( numfmt_parse ) break; case FORMAT_TYPE_INT64: val64 = unum_parseInt64(FORMATTER_OBJECT(nfo), sstr, sstr_len, position_p, &INTL_DATA_ERROR_CODE(nfo)); - if(val64 > LONG_MAX || val64 < -LONG_MAX) { + if(val64 > LONG_MAX || val64 < LONG_MIN) { RETVAL_DOUBLE(val64); } else { - val32 = (int32_t)val64; - RETVAL_LONG(val32); + RETVAL_LONG((long)val64); } break; case FORMAT_TYPE_DOUBLE: diff --git a/ext/intl/tests/bug59597.phpt b/ext/intl/tests/bug59597.phpt new file mode 100644 index 0000000000000..54c9b6d3ccd01 --- /dev/null +++ b/ext/intl/tests/bug59597.phpt @@ -0,0 +1,19 @@ +--TEST-- +Bug#59597 NumberFormatter::parse() with TYPE_INT64 results in a 32 bit integer +--SKIPIF-- + +--FILE-- +parse('2147483647', \NumberFormatter::TYPE_INT32); +var_dump($value); + +$formatter = new \NumberFormatter('en', \NumberFormatter::DECIMAL); +$value = $formatter->parse('2147483650', \NumberFormatter::TYPE_INT64); +var_dump($value); + +?> +--EXPECTF-- +int(2147483647) +int(2147483650)