diff --git a/packages/desktop-client/e2e/page-models/account-page.js b/packages/desktop-client/e2e/page-models/account-page.js index bf4fc96ba23f15d3ab694a4b34bfb2f8770211f4..37398971a19c3858641a055c9c78753da9e3aec5 100644 --- a/packages/desktop-client/e2e/page-models/account-page.js +++ b/packages/desktop-client/e2e/page-models/account-page.js @@ -91,12 +91,6 @@ export class AccountPage { return new CloseAccountModal(this.page.locator('css=[aria-modal]')); } - async _clearFocusedField() { - let isMac = process.platform === 'darwin'; - await this.page.keyboard.press(isMac ? 'Meta+A' : 'Control+A'); - await this.page.keyboard.press('Backspace'); - } - async _fillTransactionFields(transactionRow, transaction) { if (transaction.payee) { await transactionRow.getByTestId('payee').click(); @@ -123,14 +117,12 @@ export class AccountPage { if (transaction.debit) { await transactionRow.getByTestId('debit').click(); - await this._clearFocusedField(); await this.page.keyboard.type(transaction.debit); await this.page.keyboard.press('Tab'); } if (transaction.credit) { await transactionRow.getByTestId('credit').click(); - await this._clearFocusedField(); await this.page.keyboard.type(transaction.credit); await this.page.keyboard.press('Tab'); } diff --git a/packages/loot-core/src/mocks/number-formats.ts b/packages/loot-core/src/mocks/number-formats.ts deleted file mode 100644 index e586b490617808eab5151910968232f5d476d40a..0000000000000000000000000000000000000000 --- a/packages/loot-core/src/mocks/number-formats.ts +++ /dev/null @@ -1,25 +0,0 @@ -export function generateTestCases( - configurableFormats: string[], - inputFormats: Array<{ - name: string; - tests: Array<{ places: number; input: string; expected: number }>; - }>, -) { - let cases = []; - - for (let configurableFormat of configurableFormats) { - for (let inputFormat of inputFormats) { - for (let test of inputFormat.tests) { - cases.push([ - configurableFormat, - inputFormat.name, - test.places, - test.input, - test.expected, - ]); - } - } - } - - return cases; -} diff --git a/packages/loot-core/src/shared/arithmetic.test.ts b/packages/loot-core/src/shared/arithmetic.test.ts index 4d94c606fe24a3da381e81dd6a743331e1609945..c0f5afa46c516b03c17dd9a0faa4eebeee49132c 100644 --- a/packages/loot-core/src/shared/arithmetic.test.ts +++ b/packages/loot-core/src/shared/arithmetic.test.ts @@ -1,7 +1,4 @@ -import { generateTestCases } from '../mocks/number-formats'; - import evalArithmetic from './arithmetic'; -import { setNumberFormat } from './util'; describe('arithmetic', () => { test('handles negative numbers', () => { @@ -44,76 +41,4 @@ describe('arithmetic', () => { test('respects current number format', () => { expect(evalArithmetic('1,222.45')).toEqual(1222.45); }); - - let configurableFormats = [ - 'dot-comma', - 'comma-dot', - 'space-comma', - 'space-dot', - ]; - - let inputFormats = [ - { - name: 'dot-comma', - tests: [ - { places: 3, input: '1.234.567', expected: 1234567 }, - { places: 2, input: '1.234,56', expected: 1234.56 }, - { places: 1, input: '1.234,5', expected: 1234.5 }, - { places: 0, input: '1.234,', expected: 1234.0 }, - ], - }, - { - name: 'comma-dot', - tests: [ - { places: 3, input: '1,234,567', expected: 1234567 }, - { places: 2, input: '1,234.56', expected: 1234.56 }, - { places: 1, input: '1,234.5', expected: 1234.5 }, - { places: 0, input: '1,234.', expected: 1234.0 }, - ], - }, - { - name: 'dot-dot', - tests: [ - { places: 3, input: '1.234.567', expected: 1234567 }, - { places: 2, input: '1.234.56', expected: 1234.56 }, - { places: 1, input: '1.234.5', expected: 1234.5 }, - { places: 0, input: '1.234.', expected: 1234.0 }, - ], - }, - { - name: 'comma-comma', - tests: [ - { places: 3, input: '1,234,567', expected: 1234567 }, - { places: 2, input: '1,234,56', expected: 1234.56 }, - { places: 1, input: '1,234,5', expected: 1234.5 }, - { places: 0, input: '1,234,', expected: 1234.0 }, - ], - }, - { - name: 'space-comma', - tests: [ - { places: 3, input: '1 234 567', expected: 1234567 }, - { places: 2, input: '1 234,56', expected: 1234.56 }, - { places: 1, input: '1 234,5', expected: 1234.5 }, - { places: 0, input: '1 234,', expected: 1234.0 }, - ], - }, - { - name: 'space-dot', - tests: [ - { places: 3, input: '1 234 567', expected: 1234567 }, - { places: 2, input: '1 234.56', expected: 1234.56 }, - { places: 1, input: '1 234.5', expected: 1234.5 }, - { places: 0, input: '1 234.', expected: 1234.0 }, - ], - }, - ]; - - test.each(generateTestCases(configurableFormats, inputFormats))( - 'format is agnostic: %s can parse %s with %d decimal place(s)', - (configurableFormat, inputFormat, places, input, expected) => { - setNumberFormat({ format: configurableFormat, hideFraction: false }); - expect(evalArithmetic(input)).toEqual(expected); - }, - ); }); diff --git a/packages/loot-core/src/shared/arithmetic.ts b/packages/loot-core/src/shared/arithmetic.ts index 0957d10b101239d3c20e79fa02438b666a9672b2..4dd2b8955ab4e1d1a3660695101ebf54e5ce2ce7 100644 --- a/packages/loot-core/src/shared/arithmetic.ts +++ b/packages/loot-core/src/shared/arithmetic.ts @@ -1,3 +1,5 @@ +import { getNumberFormat } from './util'; + function fail(state, msg) { throw new Error( msg + ': ' + JSON.stringify(state.str.slice(state.index, 10)), @@ -27,24 +29,6 @@ function nextOperator(state, op) { return false; } -function unifyNumberFormatForParsing(numberStr: string): string { - let unifiedNumberStr = ''; - for (let i = 0; i < numberStr.length; i++) { - let ch = numberStr[i]; - if (ch === ',' || ch === '.') { - // Skip thousands separators - let remainingChars = numberStr.length - i; - if (remainingChars > 3) { - continue; - } - // Unify decimal separator - ch = '.'; - } - unifiedNumberStr += ch; - } - return unifiedNumberStr; -} - function parsePrimary(state) { // We only support numbers let isNegative = char(state) === '-'; @@ -60,14 +44,21 @@ function parsePrimary(state) { // and we should do more strict parsing let numberStr = ''; while (char(state) && char(state).match(/[0-9,.]/)) { - numberStr += next(state); + let thousandsSep = getNumberFormat().separator === ',' ? '.' : ','; + + // Don't include the thousands separator + if (char(state) === thousandsSep) { + next(state); + } else { + numberStr += next(state); + } } if (numberStr === '') { fail(state, 'Unexpected character'); } - let number = parseFloat(unifyNumberFormatForParsing(numberStr)); + let number = parseFloat(numberStr.replace(getNumberFormat().separator, '.')); return isNegative ? -number : number; } diff --git a/upcoming-release-notes/1144.md b/upcoming-release-notes/1144.md new file mode 100644 index 0000000000000000000000000000000000000000..c3dfdae2dfe075189947a0a361b31b4aa097d787 --- /dev/null +++ b/upcoming-release-notes/1144.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [j-f1] +--- + +Revert “Make number parsing agnostic to decimal and thousands separators†because it produced undesirable behavior