From cc7b199738a0ea5662103f7665221bf24c416a08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CLamentXU123=E2=80=9D?= <108666168+LamentXU123@users.noreply.github.com> Date: Mon, 1 Jun 2026 23:45:29 +0800 Subject: [PATCH] ext/intl: Preserve int64 precision in IntlNumberRangeFormatter::format() --- .../rangeformatter/rangeformatter_class.cpp | 17 ++++++++++-- .../rangeformatter_format_int64.phpt | 27 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 ext/intl/tests/rangeformatter/rangeformatter_format_int64.phpt diff --git a/ext/intl/rangeformatter/rangeformatter_class.cpp b/ext/intl/rangeformatter/rangeformatter_class.cpp index 6921791e588f..2df252d1986b 100644 --- a/ext/intl/rangeformatter/rangeformatter_class.cpp +++ b/ext/intl/rangeformatter/rangeformatter_class.cpp @@ -60,6 +60,19 @@ zend_object *IntlNumberRangeFormatter_object_create(zend_class_entry *ce) return &intern->zo; } +static icu::Formattable rangeformatter_create_formattable(zval *number) +{ + icu::Formattable formattable; + + if (Z_TYPE_P(number) == IS_DOUBLE) { + formattable.setDouble(Z_DVAL_P(number)); + } else { + formattable.setInt64(static_cast(Z_LVAL_P(number))); + } + + return formattable; +} + U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, __construct) { ZEND_PARSE_PARAMETERS_NONE(); @@ -154,8 +167,8 @@ U_CFUNC PHP_METHOD(IntlNumberRangeFormatter, format) UErrorCode error = U_ZERO_ERROR; - icu::Formattable start_formattable(Z_TYPE_P(start) == IS_DOUBLE ? Z_DVAL_P(start) : Z_LVAL_P(start)); - icu::Formattable end_formattable(Z_TYPE_P(end) == IS_DOUBLE ? Z_DVAL_P(end) : Z_LVAL_P(end)); + icu::Formattable start_formattable = rangeformatter_create_formattable(start); + icu::Formattable end_formattable = rangeformatter_create_formattable(end); UnicodeString result = RANGEFORMATTER_OBJECT(obj)->formatFormattableRange(start_formattable, end_formattable, error).toString(error); diff --git a/ext/intl/tests/rangeformatter/rangeformatter_format_int64.phpt b/ext/intl/tests/rangeformatter/rangeformatter_format_int64.phpt new file mode 100644 index 000000000000..9cefbcfb1ea8 --- /dev/null +++ b/ext/intl/tests/rangeformatter/rangeformatter_format_int64.phpt @@ -0,0 +1,27 @@ +--TEST-- +IntlNumberRangeFormatter::format() preserves int64 precision +--EXTENSIONS-- +intl +--SKIPIF-- + +--FILE-- +format(9007199254740993, 9007199254740993); +var_dump(preg_replace('/[^0-9]/', '', $formatted)); +?> +--EXPECT-- +string(16) "9007199254740993"