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