From a62a26867a4a4d39b1a4fcb65a58da8244a34fbd Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Tue, 15 Jul 2025 18:12:00 +1000 Subject: [PATCH 1/3] fix: Swiss currency parsing --- packages/@internationalized/number/src/NumberParser.ts | 2 ++ .../@internationalized/number/test/NumberParser.test.js | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/packages/@internationalized/number/src/NumberParser.ts b/packages/@internationalized/number/src/NumberParser.ts index cc0ab0b43b6..19fced679f4 100644 --- a/packages/@internationalized/number/src/NumberParser.ts +++ b/packages/@internationalized/number/src/NumberParser.ts @@ -215,6 +215,8 @@ class NumberParserImpl { } } + value = value.replace(/'/g, '’'); + // fr-FR group character is narrow non-breaking space, char code 8239 (U+202F), but that's not a key on the french keyboard, // so allow space and non-breaking space as a group char as well if (this.options.locale === 'fr-FR' && this.symbols.group) { diff --git a/packages/@internationalized/number/test/NumberParser.test.js b/packages/@internationalized/number/test/NumberParser.test.js index 4c9ef627de0..5a7e5cf145a 100644 --- a/packages/@internationalized/number/test/NumberParser.test.js +++ b/packages/@internationalized/number/test/NumberParser.test.js @@ -188,6 +188,12 @@ describe('NumberParser', function () { }); }); + it.only('should parse a swiss currency number', () => { + expect(new NumberParser('de-CH', {style: 'currency', currency: 'CHF'}).parse('CHF 1’000.00')).toBe(1000); + expect(new NumberParser('de-CH', {style: 'currency', currency: 'CHF'}).parse("CHF 1'000.00")).toBe(1000); + expect(new NumberParser('de-CH', {style: 'currency', currency: 'CHF'}).parse("CHF 1'000.00")).toBe(1000); + }); + describe('round trips', function () { fc.configureGlobal({numRuns: 200}); // Locales have to include: 'de-DE', 'ar-EG', 'fr-FR' and possibly others From 25ceb006e9c8fd3ef26c6e25b7670ea593bb2b50 Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Tue, 15 Jul 2025 18:12:19 +1000 Subject: [PATCH 2/3] remove only --- packages/@internationalized/number/test/NumberParser.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/@internationalized/number/test/NumberParser.test.js b/packages/@internationalized/number/test/NumberParser.test.js index 5a7e5cf145a..a9266d997cf 100644 --- a/packages/@internationalized/number/test/NumberParser.test.js +++ b/packages/@internationalized/number/test/NumberParser.test.js @@ -188,7 +188,7 @@ describe('NumberParser', function () { }); }); - it.only('should parse a swiss currency number', () => { + it('should parse a swiss currency number', () => { expect(new NumberParser('de-CH', {style: 'currency', currency: 'CHF'}).parse('CHF 1’000.00')).toBe(1000); expect(new NumberParser('de-CH', {style: 'currency', currency: 'CHF'}).parse("CHF 1'000.00")).toBe(1000); expect(new NumberParser('de-CH', {style: 'currency', currency: 'CHF'}).parse("CHF 1'000.00")).toBe(1000); From ce126d12157506278fcaceb3622cd10d891b5722 Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Thu, 17 Jul 2025 12:36:34 +1000 Subject: [PATCH 3/3] Apply suggestion from @snowystinger --- packages/@internationalized/number/src/NumberParser.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/@internationalized/number/src/NumberParser.ts b/packages/@internationalized/number/src/NumberParser.ts index 19fced679f4..9aeda041b6e 100644 --- a/packages/@internationalized/number/src/NumberParser.ts +++ b/packages/@internationalized/number/src/NumberParser.ts @@ -215,7 +215,9 @@ class NumberParserImpl { } } - value = value.replace(/'/g, '’'); + if (this.symbols.group && value.includes("'")) { + value = replaceAll(value, "'", this.symbols.group); + } // fr-FR group character is narrow non-breaking space, char code 8239 (U+202F), but that's not a key on the french keyboard, // so allow space and non-breaking space as a group char as well