From 109dfd6cd5a839644a184ab816951bfce4dd0c6b Mon Sep 17 00:00:00 2001 From: Giao Ho Date: Sat, 22 Apr 2023 20:09:11 +0700 Subject: [PATCH] Allow disable fix number. --- CHANGELOG.md | 17 ++++---- lib/src/filter.dart | 43 ++++++++++--------- lib/src/formatter.dart | 5 +++ pubspec.yaml | 2 +- test/number_text_input_formatter_test.dart | 48 ++++++++++++++++++++++ 5 files changed, 88 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4bb14fd..b9e7b06 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,17 +1,20 @@ -## 1.0.0 +## 1.0.0+4 -- Initial library -- Support NumberTextInputFormatter, CurrencyTextInputFormatter and PercentageTextInputFormatter. +- Allow disable fix number. -## 1.0.0+1 +## 1.0.0+3 -- Check isNotEmpty before insert prefix or suffix. +- Fix maxDecimal issue. ## 1.0.0+2 - Fix maxValue issue. +## 1.0.0+1 -## 1.0.0+3 +- Check isNotEmpty before insert prefix or suffix. -- Fix maxDecimal issue. +## 1.0.0 + +- Initial library +- Support NumberTextInputFormatter, CurrencyTextInputFormatter and PercentageTextInputFormatter. diff --git a/lib/src/filter.dart b/lib/src/filter.dart index 56a08f6..6c99a45 100644 --- a/lib/src/filter.dart +++ b/lib/src/filter.dart @@ -75,7 +75,6 @@ class TextNumberFilter { TextValueEditor filter() { editor.forEach(filterNext, filterComplete); - afterFilter(); return editor; } @@ -118,9 +117,20 @@ class TextNumberFilter { state.remove(startPosition, length); } - if (hasNumber && integerDigits == 0) { - integerDigits = 1; - state.prefix('0'); + insertIntegerDigits(); + + if (editor.isNotEmpty) { + if (decimalPoint != null) { + if (decimalDigits == 0) { + insertDecimalDigits(); + } + } else { + if (hasDecimalPoint) { + insertDecimalPoint(); + } + } + + groupDigits(); } } @@ -174,8 +184,10 @@ class TextNumberFilter { if (!allowing && startPosition < state.index) { state.remove(startPosition, state.index); } - state.prefix('0'); - integerDigits = 1; + if (options.fixNumber) { + state.prefix('0'); + integerDigits = 1; + } allowing = true; startPosition = state.index; } @@ -254,25 +266,18 @@ class TextNumberFilter { return allow; } - void afterFilter() { - if (editor.isNotEmpty) { - if (decimalPoint != null) { - if (decimalDigits == 0) { - insertDecimalDigits(); - } - } else { - if (hasDecimalPoint) { - insertDecimalPoint(); - } + void insertIntegerDigits() { + if ((decimalPoint != null || hasNumber) && integerDigits == 0) { + if (!removing && options.fixNumber) { + integerDigits = 1; + editor.prefix('0'); } - - groupDigits(); } } void insertDecimalDigits() { decimalPoint ??= editor.length - 1; - if (!removing) { + if (!removing && (options.fixNumber || options.insertDecimalDigits)) { decimalDigits = options.decimalDigits ?? 1; editor.suffix('0' * decimalDigits); } diff --git a/lib/src/formatter.dart b/lib/src/formatter.dart index e1db974..cb2e54e 100644 --- a/lib/src/formatter.dart +++ b/lib/src/formatter.dart @@ -31,6 +31,10 @@ class NumberTextInputFormatter extends TextInputFormatter { /// Allow input of negative numbers? final bool allowNegative; + /// Insert 0 before the decimal point if the number starts with a decimal point + /// Insert 0 after the decimal point if the number ends with a decimal point + final bool fixNumber; + /// Automatically insert decimal point. final bool insertDecimalPoint; @@ -57,6 +61,7 @@ class NumberTextInputFormatter extends TextInputFormatter { this.groupSeparator = ',', this.allowNegative = false, this.overrideDecimalPoint = false, + this.fixNumber = true, this.insertDecimalPoint = false, this.insertDecimalDigits = false, }) : assert(integerDigits == null || integerDigits > 0), diff --git a/pubspec.yaml b/pubspec.yaml index 3759e71..9084402 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: number_text_input_formatter description: Number Text Input Formatter for Flutter -version: 1.0.0+3 +version: 1.0.0+4 homepage: https://github.com/joutvhu/number_text_input_formatter repository: https://github.com/joutvhu/number_text_input_formatter.git diff --git a/test/number_text_input_formatter_test.dart b/test/number_text_input_formatter_test.dart index efd2834..0202116 100644 --- a/test/number_text_input_formatter_test.dart +++ b/test/number_text_input_formatter_test.dart @@ -755,6 +755,22 @@ void main() { expect(result.text, '804583.60'); }); + test('override_decimal_point_10', () { + var result = NumberTextInputFormatter( + integerDigits: 2, + decimalDigits: 2, + insertDecimalPoint: true, + ).formatEditUpdate( + const TextEditingValue( + text: '', + ), + const TextEditingValue( + text: '58', + ), + ); + expect(result.text, '0.58'); + }); + test('filter_other_decimal_point_1', () { var result = NumberTextInputFormatter( integerDigits: 13, @@ -787,6 +803,38 @@ void main() { expect(result.text, '3.66'); }); + test('filter_fix_number_1', () { + var result = NumberTextInputFormatter( + integerDigits: 12, + groupDigits: 3, + fixNumber: false + ).formatEditUpdate( + const TextEditingValue( + text: '11', + ), + const TextEditingValue( + text: '11.', + ), + ); + expect(result.text, '11.'); + }); + + test('filter_fix_number_2', () { + var result = NumberTextInputFormatter( + integerDigits: 12, + groupDigits: 3, + fixNumber: false + ).formatEditUpdate( + const TextEditingValue( + text: '11', + ), + const TextEditingValue( + text: '.11', + ), + ); + expect(result.text, '.11'); + }); + test('currency_text_input_formatter_1', () { var result = CurrencyTextInputFormatter( prefix: '\$'