fix(localize): parse negative numbers correctly

This commit is contained in:
gvangeest 2023-01-24 16:15:21 +01:00 committed by gerjanvangeest
parent 404351d865
commit 0efce8e18b
3 changed files with 40 additions and 18 deletions

View file

@ -0,0 +1,5 @@
---
'@lion/ui': patch
---
[localize] parse negative numbers

View file

@ -104,7 +104,8 @@ export function parseNumber(value, options) {
if (!containsNumbers) { if (!containsNumbers) {
return undefined; return undefined;
} }
const matchedInput = value.match(/[0-9,.\- ]/g); const valueM = value.replace(/[]/g, '-'); // U+002D, Hyphen-Minus, -
const matchedInput = valueM.match(/[0-9,.\- ]/g);
if (!matchedInput) { if (!matchedInput) {
return undefined; return undefined;
} }
@ -112,7 +113,7 @@ export function parseNumber(value, options) {
const parseMode = getParseMode(cleanedInput, options); const parseMode = getParseMode(cleanedInput, options);
switch (parseMode) { switch (parseMode) {
case 'unparseable': { case 'unparseable': {
const cleanedInputMatchStr = cleanedInput.match(/[0-9]/g)?.join(''); const cleanedInputMatchStr = cleanedInput.match(/[0-9-]/g)?.join('');
if (!cleanedInputMatchStr) { if (!cleanedInputMatchStr) {
return NaN; return NaN;
} }

View file

@ -105,30 +105,46 @@ describe('parseNumber()', () => {
expect(parseNumber('1 23.4')).to.equal(123.4); expect(parseNumber('1 23.4')).to.equal(123.4);
}); });
it('parses negative numbers', () => {
expect(parseNumber('-0')).to.equal(0);
expect(parseNumber('-1')).to.equal(-1);
expect(parseNumber('-1234')).to.equal(-1234);
expect(parseNumber('-1.234,5')).to.equal(-1234.5);
expect(parseNumber('-1,234.5')).to.equal(-1234.5);
expect(parseNumber('-1.234,5678')).to.equal(-1234.5678);
expect(parseNumber('-1,234.5678')).to.equal(-1234.5678);
});
it('ignores all non-number symbols (including currency)', () => { it('ignores all non-number symbols (including currency)', () => {
expect(parseNumber('€ 1,234.56')).to.equal(1234.56); expect(parseNumber('€ 1,234.56')).to.equal(1234.56);
expect(parseNumber('€ -1,234.56')).to.equal(-1234.56);
expect(parseNumber('-€ 1,234.56')).to.equal(-1234.56);
expect(parseNumber('1,234.56 €')).to.equal(1234.56); expect(parseNumber('1,234.56 €')).to.equal(1234.56);
expect(parseNumber('-1,234.56 €')).to.equal(-1234.56);
expect(parseNumber('EUR 1,234.56')).to.equal(1234.56); expect(parseNumber('EUR 1,234.56')).to.equal(1234.56);
expect(parseNumber('EUR -1,234.56')).to.equal(-1234.56);
expect(parseNumber('-EUR 1,234.56')).to.equal(-1234.56);
expect(parseNumber('1,234.56 EUR')).to.equal(1234.56); expect(parseNumber('1,234.56 EUR')).to.equal(1234.56);
expect(parseNumber('-1,234.56 EUR')).to.equal(-1234.56);
expect(parseNumber('Number is 1,234.56')).to.equal(1234.56); expect(parseNumber('Number is 1,234.56')).to.equal(1234.56);
}); });
describe('negative numbers', () => {
it('can get parsed', () => {
expect(parseNumber('-0')).to.equal(0);
expect(parseNumber('-1')).to.equal(-1);
expect(parseNumber('-1234')).to.equal(-1234);
expect(parseNumber('-1.234,5')).to.equal(-1234.5);
expect(parseNumber('-1,234.5')).to.equal(-1234.5);
expect(parseNumber('-1.234,5678')).to.equal(-1234.5678);
expect(parseNumber('-1,234.5678')).to.equal(-1234.5678);
});
it('parses different type of hypens', () => {
expect(parseNumber('-1')).to.equal(-1, 'Hypen');
expect(parseNumber('1')).to.equal(-1, 'Minus-Sign');
});
it('ignores all non-number symbols (including currency)', () => {
expect(parseNumber('€ -1,234.56')).to.equal(-1234.56);
expect(parseNumber('-€ 1,234.56')).to.equal(-1234.56);
expect(parseNumber('-1,234.56 €')).to.equal(-1234.56);
expect(parseNumber('EUR -1,234.56')).to.equal(-1234.56);
expect(parseNumber('-EUR 1,234.56')).to.equal(-1234.56);
expect(parseNumber('-1,234.56 EUR')).to.equal(-1234.56);
});
it('detects separators unparseable when there are 2 same ones e.g. -1.234.56', () => {
expect(parseNumber('-1.234.56')).to.equal(-123456);
expect(parseNumber('-1,234,56')).to.equal(-123456);
expect(parseNumber('-1 234 56')).to.equal(-123456);
});
});
it('ignores non-number characters and returns undefined', () => { it('ignores non-number characters and returns undefined', () => {
expect(parseNumber('A')).to.equal(undefined); expect(parseNumber('A')).to.equal(undefined);
expect(parseNumber('EUR')).to.equal(undefined); expect(parseNumber('EUR')).to.equal(undefined);