diff --git a/packages/@internationalized/number/src/NumberParser.ts b/packages/@internationalized/number/src/NumberParser.ts index f67e90ef19f..fbf9f934076 100644 --- a/packages/@internationalized/number/src/NumberParser.ts +++ b/packages/@internationalized/number/src/NumberParser.ts @@ -23,7 +23,7 @@ interface Symbols { } const CURRENCY_SIGN_REGEX = new RegExp('^.*\\(.*\\).*$'); -const NUMBERING_SYSTEMS = ['latn', 'arab', 'hanidec']; +const NUMBERING_SYSTEMS = ['latn', 'arab', 'hanidec', 'deva', 'beng']; /** * A NumberParser can be used to perform locale-aware parsing of numbers from Unicode strings, diff --git a/packages/@internationalized/number/test/NumberParser.test.js b/packages/@internationalized/number/test/NumberParser.test.js index e1716ea82ee..ab1e98ad8c8 100644 --- a/packages/@internationalized/number/test/NumberParser.test.js +++ b/packages/@internationalized/number/test/NumberParser.test.js @@ -424,6 +424,14 @@ describe('NumberParser', function () { expect(new NumberParser('en-US', {style: 'decimal'}).getNumberingSystem('一二')).toBe('hanidec'); expect(new NumberParser('en-US', {style: 'decimal'}).getNumberingSystem('一二.五')).toBe('hanidec'); + + expect(new NumberParser('en-US', {style: 'decimal'}).getNumberingSystem('१२३४')).toBe('deva'); + expect(new NumberParser('en-US', {style: 'decimal'}).getNumberingSystem('१२४,२')).toBe('deva'); + expect(new NumberParser('en-US', {style: 'decimal'}).getNumberingSystem('२.३५१')).toBe('deva'); + + expect(new NumberParser('en-US', {style: 'decimal'}).getNumberingSystem('১২৩')).toBe('beng'); + expect(new NumberParser('en-US', {style: 'decimal'}).getNumberingSystem('১.২৫৩')).toBe('beng'); + expect(new NumberParser('en-US', {style: 'decimal'}).getNumberingSystem('১২৮,৪')).toBe('beng'); }); }); }); diff --git a/packages/@react-spectrum/numberfield/test/NumberField.test.js b/packages/@react-spectrum/numberfield/test/NumberField.test.js index dc8eda77b86..b9ff89c22cf 100644 --- a/packages/@react-spectrum/numberfield/test/NumberField.test.js +++ b/packages/@react-spectrum/numberfield/test/NumberField.test.js @@ -2020,6 +2020,28 @@ describe('NumberField', function () { expect(textField).toHaveAttribute('value', formatter.format(21)); }); + it.each(locales)('%s can have devanagari numerals entered', async (locale) => { + let {textField} = renderNumberField({onChange: onChangeSpy, formatOptions: {style: 'currency', currency: 'USD'}}, {locale}); + + act(() => {textField.focus();}); + await user.keyboard('२१'); + act(() => {textField.blur();}); + + let formatter = new Intl.NumberFormat(locale + '-u-nu-deva', {style: 'currency', currency: 'USD'}); + expect(textField).toHaveAttribute('value', formatter.format(21)); + }); + + it.each(locales)('%s can have bengali numerals entered', async (locale) => { + let {textField} = renderNumberField({onChange: onChangeSpy, formatOptions: {style: 'currency', currency: 'USD'}}, {locale}); + + act(() => {textField.focus();}); + await user.keyboard('২১'); + act(() => {textField.blur();}); + + let formatter = new Intl.NumberFormat(locale + '-u-nu-beng', {style: 'currency', currency: 'USD'}); + expect(textField).toHaveAttribute('value', formatter.format(21)); + }); + describe('beforeinput', () => { let getTargetRanges = InputEvent.prototype.getTargetRanges; beforeEach(() => { diff --git a/packages/dev/docs/pages/react-aria/home/I18n.tsx b/packages/dev/docs/pages/react-aria/home/I18n.tsx index 7f183d5bfe2..8b8a8157d20 100644 --- a/packages/dev/docs/pages/react-aria/home/I18n.tsx +++ b/packages/dev/docs/pages/react-aria/home/I18n.tsx @@ -186,6 +186,8 @@ export function I18n() { Latin Arabic Hanidec + Devanagari + Bengali