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