diff --git a/packages/loot-core/src/shared/util.js b/packages/loot-core/src/shared/util.js index 1101c4212c6ab11b269ca3c40154cba30490c6f4..484ccb3216e7e589104424b3adb7128ca15e7ea4 100644 --- a/packages/loot-core/src/shared/util.js +++ b/packages/loot-core/src/shared/util.js @@ -377,15 +377,23 @@ export function looselyParseAmount(amount) { return isNaN(v) ? null : v; } + function extractNumbers(v) { + return v.replace(/[^0-9-]/g, ''); + } + + if (amount.startsWith('(') && amount.endsWith(')')) { + amount = amount.replace('(', '-').replace(')', ''); + } + let m = amount.match(/[.,][^.,]*$/); if (!m || m.index === 0) { - return safeNumber(parseFloat(amount)); + return safeNumber(parseFloat(extractNumbers(amount))); } - let left = amount.slice(0, m.index); - let right = amount.slice(m.index + 1); + let left = extractNumbers(amount.slice(0, m.index)); + let right = extractNumbers(amount.slice(m.index + 1)); - return safeNumber(parseFloat(left.replace(/[^0-9-]/g, '') + '.' + right)); + return safeNumber(parseFloat(left + '.' + right)); } export function semverToNumber(str) { diff --git a/packages/loot-core/src/shared/util.test.js b/packages/loot-core/src/shared/util.test.js index ebd52e0c02ae6cf18c7770ef6a50e5c195b0655b..afe3b3d7c5332f1e1d02a9ed603e82f56697ffcb 100644 --- a/packages/loot-core/src/shared/util.test.js +++ b/packages/loot-core/src/shared/util.test.js @@ -22,6 +22,11 @@ describe('utility functions', () => { expect(looselyParseAmount('-3,45')).toBe(-3.45); }); + test('looseParseAmount works with parentheses (negative)', () => { + expect(looselyParseAmount('(3.45)')).toBe(-3.45); + expect(looselyParseAmount('(3)')).toBe(-3); + }); + test('looseParseAmount ignores non-numeric characters', () => { // This is strange behavior because it does not work for just // `3_45_23` (it needs a decimal amount). This function should be diff --git a/upcoming-release-notes/808.md b/upcoming-release-notes/808.md new file mode 100644 index 0000000000000000000000000000000000000000..9009e101dc11e63002471f09cdbdaf43505b8cd2 --- /dev/null +++ b/upcoming-release-notes/808.md @@ -0,0 +1,6 @@ +--- +category: Enhancements +authors: [aharbis] +--- + +Import transactions with negative amounts represented as `(amount)`