diff --git a/packages/loot-core/src/shared/util.test.ts b/packages/loot-core/src/shared/util.test.ts index d236a6652a826306e128bbfaca33d18634f07601..6d1945b2987f9cf5f7cc0fe99f4b77e1032678f7 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 7429e58ef1b8f7ae836f48e0aedcd1100e17d707..460217745761ca4499458141ef751f72da501aea 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 0000000000000000000000000000000000000000..a54578e360d998aba658a679713defb5644e0baf --- /dev/null +++ b/upcoming-release-notes/2799.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [sreetamdas] +--- + +Fix amount parsing with 6-9 decimal places