diff --git a/addons/web/static/src/legacy/js/fields/field_utils.js b/addons/web/static/src/legacy/js/fields/field_utils.js index aaec21709b9..547cc784125 100644 --- a/addons/web/static/src/legacy/js/fields/field_utils.js +++ b/addons/web/static/src/legacy/js/fields/field_utils.js @@ -616,16 +616,9 @@ function parseFloat(value) { * @throws {Error} if no float is found or if parameter does not respect monetary condition */ function parseMonetary(value, field, options) { - var values = value.split(' '); - if (values.length === 1) { - values = value.split(NBSP); - } - if (values.length === 1) { + if (!value.includes(NBSP) && !value.includes(' ')) { return parseFloat(value); } - else if (values.length !== 2) { - throw new Error(_.str.sprintf(core._t("'%s' is not a correct monetary field"), value)); - } options = options || {}; var currency = options.currency; if (!currency) { @@ -636,7 +629,18 @@ function parseMonetary(value, field, options) { } currency = session.get_currency(currency_id); } - return parseFloat(values[0] === currency.symbol ? values[1] : values[0]); + if (!value.includes(currency.symbol)) { + throw new Error(_.str.sprintf(core._t("'%s' is not a correct monetary field"), value)); + } + if (currency.position === 'before') { + return parseFloat(value + .replace(`${ currency.symbol }${ NBSP }`, '') + .replace(`${ currency.symbol } `, '')); + } else { + return parseFloat(value + .replace(`${ NBSP }${ currency.symbol }`, '') + .replace(` ${ currency.symbol }`, '')); + } } /** diff --git a/addons/web/static/tests/legacy/fields/field_utils_tests.js b/addons/web/static/tests/legacy/fields/field_utils_tests.js index 08c5281752f..d39ad635dbd 100644 --- a/addons/web/static/tests/legacy/fields/field_utils_tests.js +++ b/addons/web/static/tests/legacy/fields/field_utils_tests.js @@ -261,8 +261,9 @@ QUnit.test('parse integer', function(assert) { }); QUnit.test('parse monetary', function(assert) { - assert.expect(11); + assert.expect(13); var originalCurrencies = session.currencies; + const originalParameters = _.clone(core._t.database.parameters); session.currencies = { 1: { digits: [69, 2], @@ -288,7 +289,18 @@ QUnit.test('parse monetary', function(assert) { assert.throws(function() {fieldUtils.parse.monetary("$ 12.00", {}, {currency_id: 1})}, /is not a correct/); assert.throws(function() {fieldUtils.parse.monetary("$ 12.00 34", {}, {currency_id: 3})}, /is not a correct/); + // In some languages, the non-breaking space character is used as thousands separator. + const nbsp = '\u00a0'; + _.extend(core._t.database.parameters, { + grouping: [3, 0], + decimal_point: ',', + thousands_sep: nbsp, + }); + assert.strictEqual(fieldUtils.parse.monetary(`1${nbsp}000.00${nbsp}€`, {}, {currency_id: 1}), 1000); + assert.strictEqual(fieldUtils.parse.monetary(`$${nbsp}1${nbsp}000.00`, {}, {currency_id: 3}), 1000); + session.currencies = originalCurrencies; + core._t.database.parameters = originalParameters; }); QUnit.test('parse percentage', function(assert) {