Strip literal (bidi) characters when parsing numbers

This commit is contained in:
Minh Nguyễn
2021-11-16 17:09:27 -08:00
parent ecb7c20bbf
commit 5d224a41cd
2 changed files with 13 additions and 1 deletions

View File

@@ -439,15 +439,17 @@ export function coreLocalizer() {
if (!('Intl' in window && 'NumberFormat' in Intl)) return polyfill;
const format = new Intl.NumberFormat(locale, { maximumFractionDigits: 20 });
if (!('formatToParts' in format)) return polyfill;
const parts = format.formatToParts(12345.6);
const parts = format.formatToParts(-12345.6);
const numerals = Array.from({ length: 10 }).map((_, i) => format.format(i));
const index = new Map(numerals.map((d, i) => [d, i]));
const literal = new RegExp(`[${parts.find(d => d.type === 'literal').value}]`, 'g');
const group = new RegExp(`[${parts.find(d => d.type === 'group').value}]`, 'g');
const decimal = new RegExp(`[${parts.find(d => d.type === 'decimal').value}]`);
const numeral = new RegExp(`[${numerals.join('')}]`, 'g');
const getIndex = d => index.get(d);
return (string) => {
string = string.trim()
.replace(literal, '')
.replace(group, '')
.replace(decimal, '.')
.replace(numeral, getIndex);

View File

@@ -27,6 +27,16 @@ describe('iD.coreLocalizer', function() {
expect(parseFloat(formatFloat(1234.56))).to.eql(1234.56);
expect(parseFloat(formatFloat(3.14159))).to.eql(3.14159);
});
it('roundtrips Hebrew numbers', function () {
var localizer = iD.coreLocalizer();
var formatFloat = localizer.floatFormatter('he');
var parseFloat = localizer.floatParser('he');
expect(parseFloat(formatFloat(-0.1))).to.eql(-0.1);
expect(parseFloat(formatFloat(1.234))).to.eql(1.234);
expect(parseFloat(formatFloat(1234))).to.eql(1234);
expect(parseFloat(formatFloat(1234.56))).to.eql(1234.56);
expect(parseFloat(formatFloat(3.14159))).to.eql(3.14159);
});
it('roundtrips Arabic numbers', function () {
var localizer = iD.coreLocalizer();
var formatFloat = localizer.floatFormatter('ar-EG');