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) {
|
||||
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) {
|
||||
return undefined;
|
||||
}
|
||||
|
|
@ -112,7 +113,7 @@ export function parseNumber(value, options) {
|
|||
const parseMode = getParseMode(cleanedInput, options);
|
||||
switch (parseMode) {
|
||||
case 'unparseable': {
|
||||
const cleanedInputMatchStr = cleanedInput.match(/[0-9]/g)?.join('');
|
||||
const cleanedInputMatchStr = cleanedInput.match(/[0-9-]/g)?.join('');
|
||||
if (!cleanedInputMatchStr) {
|
||||
return NaN;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -105,30 +105,46 @@ describe('parseNumber()', () => {
|
|||
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)', () => {
|
||||
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('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);
|
||||
});
|
||||
|
||||
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', () => {
|
||||
expect(parseNumber('A')).to.equal(undefined);
|
||||
expect(parseNumber('EUR')).to.equal(undefined);
|
||||
|
|
|
|||
Loading…
Reference in a new issue