From 6d7d12138c35c9b319f16b736e60af7a368eacb9 Mon Sep 17 00:00:00 2001 From: youngcw <calebyoung94@gmail.com> Date: Wed, 28 Feb 2024 11:39:23 -0700 Subject: [PATCH] Update csv amount parser. Fix #2374 (#2399) * specify 2 decimal places in the csv amount parser * note * update tests * cleanup --- packages/loot-core/src/shared/util.test.ts | 11 ++++++----- packages/loot-core/src/shared/util.ts | 2 +- upcoming-release-notes/2399.md | 6 ++++++ 3 files changed, 13 insertions(+), 6 deletions(-) create mode 100644 upcoming-release-notes/2399.md diff --git a/packages/loot-core/src/shared/util.test.ts b/packages/loot-core/src/shared/util.test.ts index ea42f2532..eaee1ee84 100644 --- a/packages/loot-core/src/shared/util.test.ts +++ b/packages/loot-core/src/shared/util.test.ts @@ -5,15 +5,16 @@ describe('utility functions', () => { expect(looselyParseAmount('3')).toBe(3); expect(looselyParseAmount('3.45')).toBe(3.45); - // Right now it doesn't actually parse an "amount", it just parses - // a number. An "amount" is a valid transaction amount, usually a - // number with 2 decimal places. - expect(looselyParseAmount('3.456')).toBe(3.456); + // Parsing is currently limited to 2 decimal places. + // Only <. ,> and 2 other chars counts as decimal places + // Proper parsing would include format settings, + // but currently we are format agnostic + expect(looselyParseAmount('3.456')).toBe(3456); }); test('looseParseAmount works with alternate formats', () => { expect(looselyParseAmount('3,45')).toBe(3.45); - expect(looselyParseAmount('3,456')).toBe(3.456); + expect(looselyParseAmount('3,456')).toBe(3456); }); 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 a670b775c..91f39de60 100644 --- a/packages/loot-core/src/shared/util.ts +++ b/packages/loot-core/src/shared/util.ts @@ -370,7 +370,7 @@ export function looselyParseAmount(amount: string) { amount = amount.replace('(', '-').replace(')', ''); } - const m = amount.match(/[.,][^.,]*$/); + const m = amount.match(/[.,][^.,]{1,2}$/); if (!m || m.index === undefined || m.index === 0) { return safeNumber(parseFloat(extractNumbers(amount))); } diff --git a/upcoming-release-notes/2399.md b/upcoming-release-notes/2399.md new file mode 100644 index 000000000..f1d2598ed --- /dev/null +++ b/upcoming-release-notes/2399.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [youngcw] +--- + +Only match 2 decimal places when parsing amounts for file import -- GitLab