From 83f9baa36d81ad567daa84844173d78930bd6fd1 Mon Sep 17 00:00:00 2001 From: Victor Kachan Date: Tue, 25 Jun 2019 10:42:05 +0200 Subject: [PATCH] fix(input-amount): support negative numbers --- packages/input-amount/src/parsers.js | 4 ++-- packages/input-amount/stories/index.stories.js | 11 +++++++++++ packages/input-amount/test/formatters.test.js | 7 +++++++ packages/input-amount/test/parsers.test.js | 16 ++++++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/input-amount/src/parsers.js b/packages/input-amount/src/parsers.js index 1b5af0432..c194156a8 100644 --- a/packages/input-amount/src/parsers.js +++ b/packages/input-amount/src/parsers.js @@ -61,7 +61,7 @@ function getParseMode(value) { */ function parseWithLocale(value, options) { const separator = getDecimalSeparator(options); - const regexNumberAndLocaleSeparator = new RegExp(`[0-9${separator}]`, 'g'); + const regexNumberAndLocaleSeparator = new RegExp(`[0-9${separator}-]`, 'g'); let numberAndLocaleSeparator = value.match(regexNumberAndLocaleSeparator).join(''); if (separator === ',') { numberAndLocaleSeparator = numberAndLocaleSeparator.replace(',', '.'); @@ -110,7 +110,7 @@ function parseHeuristic(value) { * @param {object} options Locale Options */ export function parseAmount(value, options) { - const matchedInput = value.match(/[0-9,. ]/g); + const matchedInput = value.match(/[0-9,.\- ]/g); if (!matchedInput) { return undefined; } diff --git a/packages/input-amount/stories/index.stories.js b/packages/input-amount/stories/index.stories.js index 285d44a78..9678e8c78 100644 --- a/packages/input-amount/stories/index.stories.js +++ b/packages/input-amount/stories/index.stories.js @@ -10,6 +10,17 @@ storiesOf('Forms|Input Amount', module) `, ) + .add( + 'Negative number', + () => html` + + + `, + ) .add( 'Set USD as currency', () => html` diff --git a/packages/input-amount/test/formatters.test.js b/packages/input-amount/test/formatters.test.js index 6a7b63660..c7ab4adb3 100644 --- a/packages/input-amount/test/formatters.test.js +++ b/packages/input-amount/test/formatters.test.js @@ -54,6 +54,13 @@ describe('formatAmount()', () => { maximumFractionDigits: 3, }), ).to.equal('12.346'); + expect( + formatAmount(-12.345678, { + locale: 'en-GB', + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }), + ).to.equal('-12.35'); }); it('formats the right amount of fraction digits for a certain currency', async () => { diff --git a/packages/input-amount/test/parsers.test.js b/packages/input-amount/test/parsers.test.js index 9b811d69a..d5280b585 100644 --- a/packages/input-amount/test/parsers.test.js +++ b/packages/input-amount/test/parsers.test.js @@ -112,11 +112,27 @@ describe('parseAmount()', () => { expect(parseAmount('1 23.4')).to.equal(123.4); }); + it('parses negative numbers', () => { + expect(parseAmount('-0')).to.equal(0); + expect(parseAmount('-1')).to.equal(-1); + expect(parseAmount('-1234')).to.equal(-1234); + expect(parseAmount('-1.234,5')).to.equal(-1234.5); + expect(parseAmount('-1,234.5')).to.equal(-1234.5); + expect(parseAmount('-1.234,5678')).to.equal(-1234.5678); + expect(parseAmount('-1,234.5678')).to.equal(-1234.5678); + }); + it('ignores all non-number symbols (including currency)', () => { expect(parseAmount('€ 1,234.56')).to.equal(1234.56); + expect(parseAmount('€ -1,234.56')).to.equal(-1234.56); + expect(parseAmount('-€ 1,234.56')).to.equal(-1234.56); expect(parseAmount('1,234.56 €')).to.equal(1234.56); + expect(parseAmount('-1,234.56 €')).to.equal(-1234.56); expect(parseAmount('EUR 1,234.56')).to.equal(1234.56); + expect(parseAmount('EUR -1,234.56')).to.equal(-1234.56); + expect(parseAmount('-EUR 1,234.56')).to.equal(-1234.56); expect(parseAmount('1,234.56 EUR')).to.equal(1234.56); + expect(parseAmount('-1,234.56 EUR')).to.equal(-1234.56); expect(parseAmount('Number is 1,234.56')).to.equal(1234.56); });