diff --git a/packages/@adobe/react-spectrum/test/datepicker/DatePicker.test.js b/packages/@adobe/react-spectrum/test/datepicker/DatePicker.test.js index bfb348ecb03..c8c17de13b8 100644 --- a/packages/@adobe/react-spectrum/test/datepicker/DatePicker.test.js +++ b/packages/@adobe/react-spectrum/test/datepicker/DatePicker.test.js @@ -1618,11 +1618,14 @@ describe('DatePicker', function () { }); it('should support typing into the era segment', function () { + let formatter = new Intl.DateTimeFormat('en-US-u-ca-ethiopic', {year: 'numeric', era: 'narrow', timeZone: 'UTC'}); + let era0 = formatter.formatToParts(0).find(p => p.type === 'era').value; + testInput('era,', new CalendarDate(new JapaneseCalendar(), 'reiwa', 5, 2, 3), 'h', new CalendarDate(new JapaneseCalendar(), 'heisei', 5, 2, 3), false, {locale: 'en-US-u-ca-japanese'}); testInput('era,', new CalendarDate(new JapaneseCalendar(), 'reiwa', 5, 2, 3), 's', new CalendarDate(new JapaneseCalendar(), 'showa', 5, 2, 3), false, {locale: 'en-US-u-ca-japanese'}); testInput('era,', new CalendarDate(new JapaneseCalendar(), 'showa', 5, 2, 3), 'r', new CalendarDate(new JapaneseCalendar(), 'reiwa', 5, 2, 3), false, {locale: 'en-US-u-ca-japanese'}); - testInput('era,', new CalendarDate(new EthiopicCalendar(), 'AM', 2012, 2, 3), '0', new CalendarDate(new EthiopicCalendar(), 'AA', 2012, 2, 3), false, {locale: 'en-US-u-ca-ethiopic'}); - testInput('era,', new CalendarDate(new EthiopicCalendar(), 'AA', 2012, 2, 3), '1', new CalendarDate(new EthiopicCalendar(), 'AM', 2012, 2, 3), false, {locale: 'en-US-u-ca-ethiopic'}); + testInput('era,', new CalendarDate(new EthiopicCalendar(), 'AM', 2012, 2, 3), era0 === 'AM' ? 'A' : '0', new CalendarDate(new EthiopicCalendar(), 'AA', 2012, 2, 3), false, {locale: 'en-US-u-ca-ethiopic'}); + testInput('era,', new CalendarDate(new EthiopicCalendar(), 'AA', 2012, 2, 3), era0 === 'AM' ? 'M' : '1', new CalendarDate(new EthiopicCalendar(), 'AM', 2012, 2, 3), false, {locale: 'en-US-u-ca-ethiopic'}); }); it('should allow entering invalid dates, and constrain on blur', async function () { diff --git a/packages/@internationalized/number/src/NumberParser.ts b/packages/@internationalized/number/src/NumberParser.ts index dfeb7c6c24f..6ecf2ce69ad 100644 --- a/packages/@internationalized/number/src/NumberParser.ts +++ b/packages/@internationalized/number/src/NumberParser.ts @@ -232,6 +232,11 @@ class NumberParserImpl { value = replaceAll(value, "'", this.symbols.group); } + // On newer ICU versions, the special single quote has been normalized, so we need to backport. + if (this.symbols.group === "'" && value.includes('’') && isGroupSymbolAllowed) { + 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 if (this.options.locale === 'fr-FR' && this.symbols.group && isGroupSymbolAllowed) {