]> granicus.if.org Git - php/commitdiff
Bug#59597 NumberFormatter::parse() with TYPE_INT64 results in a 32 bit integer
authorSherif Ramadan <theanomaly.is@gmail.com>
Thu, 19 Apr 2012 08:44:43 +0000 (04:44 -0400)
committerSherif Ramadan <theanomaly.is@gmail.com>
Thu, 19 Apr 2012 08:44:43 +0000 (04:44 -0400)
ext/intl/formatter/formatter_parse.c
ext/intl/tests/bug59597.phpt [new file with mode: 0644]

index cbdde855dece8def0ffd25419d9c58e1635bd8f4..6f3a3a12b5b7afcfc24ccd5332be09c58e1dd1e3 100755 (executable)
@@ -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 (file)
index 0000000..54c9b6d
--- /dev/null
@@ -0,0 +1,19 @@
+--TEST--
+Bug#59597 NumberFormatter::parse() with TYPE_INT64 results in a 32 bit integer
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+--FILE--
+<?php
+
+$formatter = new \NumberFormatter('en', \NumberFormatter::DECIMAL);
+$value = $formatter->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)