fix(localize): parse negative numbers correctly
This commit is contained in:
parent
404351d865
commit
0efce8e18b
3 changed files with 40 additions and 18 deletions
5
.changeset/seven-hotels-reflect.md
Normal file
5
.changeset/seven-hotels-reflect.md
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'@lion/ui': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
[localize] parse negative numbers
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue