diff --git a/.changeset/seven-hotels-reflect.md b/.changeset/seven-hotels-reflect.md new file mode 100644 index 000000000..be6d56e3e --- /dev/null +++ b/.changeset/seven-hotels-reflect.md @@ -0,0 +1,5 @@ +--- +'@lion/ui': patch +--- + +[localize] parse negative numbers diff --git a/packages/ui/components/localize/src/number/parseNumber.js b/packages/ui/components/localize/src/number/parseNumber.js index b64535701..abfec8a7c 100644 --- a/packages/ui/components/localize/src/number/parseNumber.js +++ b/packages/ui/components/localize/src/number/parseNumber.js @@ -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; } diff --git a/packages/ui/components/localize/test/number/parseNumber.test.js b/packages/ui/components/localize/test/number/parseNumber.test.js index f782efb5f..1f0a57250 100644 --- a/packages/ui/components/localize/test/number/parseNumber.test.js +++ b/packages/ui/components/localize/test/number/parseNumber.test.js @@ -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);