From a49081bd1150e90dd8d4a4b63c951f453f348121 Mon Sep 17 00:00:00 2001 From: Douglas Franca Date: Fri, 30 Aug 2024 15:29:56 -0300 Subject: [PATCH] fix: dynamically change the number of decimals and retain the value - Adjusted the test to verify that the number of decimals can be changed dynamically. - Ensured that the value is correctly formatted when the number of decimals is updated. --- src/global/number/number.js | 6 ++++++ src/global/number/number.test.js | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/global/number/number.js b/src/global/number/number.js index f4473edb..dd778392 100644 --- a/src/global/number/number.js +++ b/src/global/number/number.js @@ -81,6 +81,12 @@ function NumberMaskDirective($locale, $parse) { viewMask = NumberMasks.viewMask(decimals, decimalDelimiter, thousandsDelimiter); modelMask = NumberMasks.modelMask(decimals); + const newValue = parseFloat(ctrl.$modelValue); + if (!isNaN(newValue) && !ctrl.$isEmpty(newValue)) { + ctrl.$setViewValue(newValue.toFixed(decimals)); + ctrl.$render(); + } + parser(ctrl.$viewValue); }); } diff --git a/src/global/number/number.test.js b/src/global/number/number.test.js index 633a1985..d757d619 100644 --- a/src/global/number/number.test.js +++ b/src/global/number/number.test.js @@ -163,4 +163,27 @@ describe('ui-number-mask', function() { expect(model.$viewValue).toBe(''); expect(model.$modelValue).toBe(null); }); + + it('should change the number of decimals dynamically and keep the value', angular.mock.inject(function($timeout) { + const input = TestUtil.compile('', { + model: 1234.56, + decimals: 2 + }); + + const model = input.controller('ngModel'); + + expect(model.$viewValue).toBe('1,234.56'); + + input.scope().decimals = 3; + + $timeout(() => { + expect(model.$viewValue).toBe('1,234.560'); + + input.scope().decimals = 1; + + $timeout(() => { + expect(model.$viewValue).toBe('1,234.5'); + }); + }); + })); });