From 5d9eba65f88d8d75c09fa6d6ef64a80249c0f36e Mon Sep 17 00:00:00 2001 From: Konstantin Serov Date: Mon, 16 Jan 2023 17:52:30 +0700 Subject: [PATCH] Fixed https://github.com/caseyryan/flutter_multi_formatter/issues/113 --- CHANGELOG.md | 3 + .../lib/pages/credit_card_format_page.dart | 5 ++ example/pubspec.lock | 2 +- .../credit_card_number_input_formatter.dart | 77 +++++++++++-------- lib/formatters/formatter_utils.dart | 8 ++ pubspec.yaml | 2 +- 6 files changed, 62 insertions(+), 35 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fed5fc6..4469677 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [2.10.2] +- Fixed a problem with incorrect card system detection +- Fixed https://github.com/caseyryan/flutter_multi_formatter/issues/113 ## [2.10.1] - A few fixes to PinyinUtils ## [2.10.0] diff --git a/example/lib/pages/credit_card_format_page.dart b/example/lib/pages/credit_card_format_page.dart index c541873..c3df17d 100644 --- a/example/lib/pages/credit_card_format_page.dart +++ b/example/lib/pages/credit_card_format_page.dart @@ -22,6 +22,11 @@ class _CreditCardFormatPageState extends State { @override Widget build(BuildContext context) { + final negativeString = toCurrencyString( + '-888', + mantissaLength: 2, + ); + print(negativeString); return Unfocuser( child: Scaffold( appBar: AppBar( diff --git a/example/pubspec.lock b/example/pubspec.lock index a93449b..534736e 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -96,7 +96,7 @@ packages: path: ".." relative: true source: path - version: "2.10.1" + version: "2.10.2" flutter_test: dependency: "direct dev" description: flutter diff --git a/lib/formatters/credit_card_number_input_formatter.dart b/lib/formatters/credit_card_number_input_formatter.dart index 3a4c9c6..17a3985 100644 --- a/lib/formatters/credit_card_number_input_formatter.dart +++ b/lib/formatters/credit_card_number_input_formatter.dart @@ -230,41 +230,52 @@ class _CardSystemDatas { /// рекурсивно ищет в номере карты код системы, начиная с конца /// нужно для того, чтобы даже после setState и обнуления данных карты /// снова правильно отформатировать ее номер - static CardSystemData? getCardSystemDataByNumber(String cardNumber, - {int? subscringLength}) { + static CardSystemData? getCardSystemDataByNumber( + String cardNumber, { + int? subscringLength, + }) { if (cardNumber.isEmpty) return null; subscringLength = subscringLength ?? cardNumber.length; if (subscringLength < 1) return null; - var systemCode = cardNumber.substring(0, subscringLength); - - var rawData = _data.firstWhere((Map? data) { - if (data != null) { - var numericValue = toNumericString(data['systemCode']); - var numDigits = data['numDigits']; - return numericValue == systemCode && - numDigits >= cardNumber.length && - numDigits <= _maxDigitsInCard; + Map? rawData; + List tempSystems = []; + for (var data in _data) { + final systemCode = data['systemCode']; + if (cardNumber.startsWith(systemCode)) { + tempSystems.add(data); } - return false; - }, orElse: () => null); - if (rawData != null) { - return CardSystemData.fromMap(rawData); } - return getCardSystemDataByNumber( - cardNumber, - subscringLength: subscringLength - 1, - ); - } + if (tempSystems.isEmpty) { + return null; + } + if (tempSystems.length == 1) { + rawData = tempSystems.first; + } else { + tempSystems.sort((a, b) => b['systemCode'].compareTo(a['systemCode'])); + final int maxCodeLength = tempSystems.first['systemCode'].length; + tempSystems = tempSystems + .where( + (e) => e['systemCode'].length == maxCodeLength, + ) + .toList(); - static int get _maxDigitsInCard { - return _data.map((data) { - int numDigits = data!['numDigits']; - return numDigits; - }).reduce(max); + tempSystems.sort((a, b) => a['systemCode'].compareTo(b['systemCode'])); + for (var data in tempSystems) { + final int numMaskDigits = data['numDigits']!; + if (cardNumber.length <= numMaskDigits) { + rawData = data; + break; + } + } + if (rawData == null) { + rawData = tempSystems.last; + } + } + return CardSystemData.fromMap(rawData); } - static List?> _data = ?>[ + static List> _data = >[ { 'system': CardSystem.VISA, 'systemCode': '4', @@ -327,16 +338,16 @@ class _CardSystemDatas { }, { 'system': CardSystem.JCB, - 'systemCode': '3589', - 'numberMask': '0000 0000 0000 0000 000', - 'numDigits': 19, - }, - { - 'system': CardSystem.JCB, - 'systemCode': '3528', + 'systemCode': '35', 'numberMask': '0000 0000 0000 0000', 'numDigits': 16, }, + // { + // 'system': CardSystem.JCB, + // 'systemCode': '35', + // 'numberMask': '0000 0000 0000 0000 000', + // 'numDigits': 19, + // }, { 'system': CardSystem.DISCOVER, 'systemCode': '60', diff --git a/lib/formatters/formatter_utils.dart b/lib/formatters/formatter_utils.dart index 62a5365..2393de0 100644 --- a/lib/formatters/formatter_utils.dart +++ b/lib/formatters/formatter_utils.dart @@ -499,6 +499,11 @@ String toCurrencyString( String trailingSymbol = '', bool useSymbolPadding = false, }) { + bool isNegative = false; + if (value.startsWith('-')) { + value = value.replaceAll(RegExp(r'^[-+]+'), ''); + isNegative = true; + } value = value.replaceAll(_spaceRegex, ''); if (value.isEmpty) { value = '0'; @@ -654,6 +659,9 @@ String toCurrencyString( } } value = sb.toString(); + if (isNegative) { + return '-$value'; + } return value; } diff --git a/pubspec.yaml b/pubspec.yaml index 6d859b4..e3cf75c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: flutter_multi_formatter description: A package of formatters for international phone numbers, credit / debit cards and a masked formatter -version: 2.10.1 +version: 2.10.2 homepage: https://github.com/caseyryan/flutter_multi_formatter environment: