@@ -191,11 +191,18 @@ class NumberParserImpl {
191
191
192
192
const nonLiteralParts = new Set ( [ 'decimal' , 'fraction' , 'integer' , 'minusSign' , 'plusSign' , 'group' ] ) ;
193
193
194
+ // This list is derived from https://www.unicode.org/cldr/charts/43/supplemental/language_plural_rules.html#comparison and includes
195
+ // all unique numbers which we need to check in order to determine all the plural forms for a given locale.
196
+ // See: https://github.com/adobe/react-spectrum/pull/5134/files#r1337037855 for used script
197
+ const pluralNumbers = [
198
+ 0 , 4 , 2 , 1 , 11 , 20 , 3 , 7 , 100 , 21 , 0.1 , 1.1
199
+ ] ;
200
+
194
201
function getSymbols ( formatter : Intl . NumberFormat , intlOptions : Intl . ResolvedNumberFormatOptions , originalOptions : Intl . NumberFormatOptions ) : Symbols {
195
202
// Note: some locale's don't add a group symbol until there is a ten thousands place
196
203
let allParts = formatter . formatToParts ( - 10000.111 ) ;
197
204
let posAllParts = formatter . formatToParts ( 10000.111 ) ;
198
- let singularParts = formatter . formatToParts ( 1 ) ;
205
+ let pluralParts = pluralNumbers . map ( n => formatter . formatToParts ( n ) ) ;
199
206
200
207
let minusSign = allParts . find ( p => p . type === 'minusSign' ) ?. value ?? '-' ;
201
208
let plusSign = posAllParts . find ( p => p . type === 'plusSign' ) ?. value ;
@@ -212,9 +219,10 @@ function getSymbols(formatter: Intl.NumberFormat, intlOptions: Intl.ResolvedNumb
212
219
213
220
// this set is also for a regex, it's all literals that might be in the string we want to eventually parse that
214
221
// don't contribute to the numerical value
215
- let pluralLiterals = allParts . filter ( p => ! nonLiteralParts . has ( p . type ) ) . map ( p => escapeRegex ( p . value ) ) ;
216
- let singularLiterals = singularParts . filter ( p => ! nonLiteralParts . has ( p . type ) ) . map ( p => escapeRegex ( p . value ) ) ;
217
- let sortedLiterals = [ ...new Set ( [ ...singularLiterals , ...pluralLiterals ] ) ] . sort ( ( a , b ) => b . length - a . length ) ;
222
+ let allPartsLiterals = allParts . filter ( p => ! nonLiteralParts . has ( p . type ) ) . map ( p => escapeRegex ( p . value ) ) ;
223
+ let pluralPartsLiterals = pluralParts . flatMap ( p => p . filter ( p => ! nonLiteralParts . has ( p . type ) ) . map ( p => escapeRegex ( p . value ) ) ) ;
224
+ let sortedLiterals = [ ...new Set ( [ ...allPartsLiterals , ...pluralPartsLiterals ] ) ] . sort ( ( a , b ) => b . length - a . length ) ;
225
+
218
226
let literals = sortedLiterals . length === 0 ?
219
227
new RegExp ( '[\\p{White_Space}]' , 'gu' ) :
220
228
new RegExp ( `${ sortedLiterals . join ( '|' ) } |[\\p{White_Space}]` , 'gu' ) ;
0 commit comments