From 7596548e9b836a5d12e966bf296a4dbba044b78f Mon Sep 17 00:00:00 2001 From: Xia Chao <236466140+bun-unsafe@users.noreply.github.com> Date: Tue, 25 Aug 2026 15:50:22 +0800 Subject: [PATCH] fix(common): use locale NaN symbol in number formatting Non-finite values all used NumberSymbol.Infinity, so formatNumber(NaN) rendered as infinity. Locale data already defines NumberSymbol.NaN. --- packages/common/src/i18n/format_number.ts | 6 +++++- packages/common/test/i18n/format_number_spec.ts | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/common/src/i18n/format_number.ts b/packages/common/src/i18n/format_number.ts index 6c7aa111805..7ef0f8154cb 100644 --- a/packages/common/src/i18n/format_number.ts +++ b/packages/common/src/i18n/format_number.ts @@ -43,7 +43,11 @@ function formatNumberToLocaleString( let isZero = false; if (!isFinite(value)) { - formattedText = getLocaleNumberSymbol(locale, NumberSymbol.Infinity); + // `Number.isNaN` (not `!isFinite`) so NaN uses the locale NaN symbol, not Infinity. + formattedText = getLocaleNumberSymbol( + locale, + Number.isNaN(value) ? NumberSymbol.NaN : NumberSymbol.Infinity, + ); } else { let parsedNumber = parseNumber(value); diff --git a/packages/common/test/i18n/format_number_spec.ts b/packages/common/test/i18n/format_number_spec.ts index 0f42e955c69..3f3049982bc 100644 --- a/packages/common/test/i18n/format_number_spec.ts +++ b/packages/common/test/i18n/format_number_spec.ts @@ -38,6 +38,16 @@ describe('Format number', () => { expect(formatNumber(1e100, ɵDEFAULT_LOCALE_ID)).toEqual('1E+100'); }); + it('should format NaN and Infinity with locale symbols', () => { + expect(formatNumber(NaN, ɵDEFAULT_LOCALE_ID)).toEqual('NaN'); + expect(formatNumber(Infinity, ɵDEFAULT_LOCALE_ID)).toEqual('∞'); + expect(formatNumber(-Infinity, ɵDEFAULT_LOCALE_ID)).toEqual('-∞'); + expect(formatPercent(NaN, ɵDEFAULT_LOCALE_ID)).toEqual('NaN%'); + expect(formatPercent(Infinity, ɵDEFAULT_LOCALE_ID)).toEqual('∞%'); + expect(formatCurrency(NaN, ɵDEFAULT_LOCALE_ID, '$')).toEqual('$NaN'); + expect(formatCurrency(Infinity, ɵDEFAULT_LOCALE_ID, '$')).toEqual('$∞'); + }); + it('should throw if minFractionDigits is explicitly higher than maxFractionDigits', () => { expect(() => formatNumber(1.1, ɵDEFAULT_LOCALE_ID, '3.4-2')).toThrowError( /is higher than the maximum/,