From 2959054d0cb7c442cfc419acdde981e3437a3bb9 Mon Sep 17 00:00:00 2001 From: Sreetam Das <sreetamdas@gmail.com> Date: Mon, 3 Jun 2024 20:22:01 +0530 Subject: [PATCH] Update regex for `looselyParseAmount` for 5-9 decimal places (#2799) * Update regex for `looselyParseAmount` for 5-9 decimal places * Add release note * Update comment, add some more tests --- packages/loot-core/src/shared/util.test.ts | 10 +++++++++- packages/loot-core/src/shared/util.ts | 4 ++-- upcoming-release-notes/2799.md | 6 ++++++ 3 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 upcoming-release-notes/2799.md diff --git a/packages/loot-core/src/shared/util.test.ts b/packages/loot-core/src/shared/util.test.ts index d236a6652..6d1945b29 100644 --- a/packages/loot-core/src/shared/util.test.ts +++ b/packages/loot-core/src/shared/util.test.ts @@ -2,7 +2,7 @@ import { looselyParseAmount, getNumberFormat, setNumberFormat } from './util'; describe('utility functions', () => { test('looseParseAmount works with basic numbers', () => { - // Parsing is currently limited to 1,2 decimal places or 5. + // Parsing is currently limited to 1,2 decimal places or 5-9. // Ignoring 3 places removes the possibility of improper parse // of amounts without decimal amounts included. expect(looselyParseAmount('3')).toBe(3); @@ -10,12 +10,20 @@ describe('utility functions', () => { expect(looselyParseAmount('3.45')).toBe(3.45); expect(looselyParseAmount('3.456')).toBe(3456); expect(looselyParseAmount('3.45000')).toBe(3.45); + expect(looselyParseAmount('3.450000')).toBe(3.45); + expect(looselyParseAmount('3.4500000')).toBe(3.45); + expect(looselyParseAmount('3.45000000')).toBe(3.45); + expect(looselyParseAmount('3.450000000')).toBe(3.45); }); test('looseParseAmount works with alternate formats', () => { expect(looselyParseAmount('3,45')).toBe(3.45); expect(looselyParseAmount('3,456')).toBe(3456); expect(looselyParseAmount('3,45000')).toBe(3.45); + expect(looselyParseAmount('3,450000')).toBe(3.45); + expect(looselyParseAmount('3,4500000')).toBe(3.45); + expect(looselyParseAmount('3,45000000')).toBe(3.45); + expect(looselyParseAmount('3,450000000')).toBe(3.45); }); test('looseParseAmount works with negative numbers', () => { diff --git a/packages/loot-core/src/shared/util.ts b/packages/loot-core/src/shared/util.ts index 7429e58ef..460217745 100644 --- a/packages/loot-core/src/shared/util.ts +++ b/packages/loot-core/src/shared/util.ts @@ -409,9 +409,9 @@ export function looselyParseAmount(amount: string) { amount = amount.replace('(', '-').replace(')', ''); } - //look for a decimal marker, then look for either 5 or 1-2 decimal places. + // Look for a decimal marker, then look for either 1-2 or 5-9 decimal places. // This avoids matching against 3 places which may not actually be decimal - const m = amount.match(/[.,]([^.,]{5}|[^.,]{1,2})$/); + const m = amount.match(/[.,]([^.,]{5,9}|[^.,]{1,2})$/); if (!m || m.index === undefined || m.index === 0) { return safeNumber(parseFloat(extractNumbers(amount))); } diff --git a/upcoming-release-notes/2799.md b/upcoming-release-notes/2799.md new file mode 100644 index 000000000..a54578e36 --- /dev/null +++ b/upcoming-release-notes/2799.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [sreetamdas] +--- + +Fix amount parsing with 6-9 decimal places -- GitLab