Skip to content

Commit 5d9eba6

Browse files
committed
Fixed #113
1 parent 4c47366 commit 5d9eba6

6 files changed

Lines changed: 62 additions & 35 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## [2.10.2]
2+
- Fixed a problem with incorrect card system detection
3+
- Fixed https://github.com/caseyryan/flutter_multi_formatter/issues/113
14
## [2.10.1]
25
- A few fixes to PinyinUtils
36
## [2.10.0]

example/lib/pages/credit_card_format_page.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ class _CreditCardFormatPageState extends State<CreditCardFormatPage> {
2222

2323
@override
2424
Widget build(BuildContext context) {
25+
final negativeString = toCurrencyString(
26+
'-888',
27+
mantissaLength: 2,
28+
);
29+
print(negativeString);
2530
return Unfocuser(
2631
child: Scaffold(
2732
appBar: AppBar(

example/pubspec.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ packages:
9696
path: ".."
9797
relative: true
9898
source: path
99-
version: "2.10.1"
99+
version: "2.10.2"
100100
flutter_test:
101101
dependency: "direct dev"
102102
description: flutter

lib/formatters/credit_card_number_input_formatter.dart

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -230,41 +230,52 @@ class _CardSystemDatas {
230230
/// рекурсивно ищет в номере карты код системы, начиная с конца
231231
/// нужно для того, чтобы даже после setState и обнуления данных карты
232232
/// снова правильно отформатировать ее номер
233-
static CardSystemData? getCardSystemDataByNumber(String cardNumber,
234-
{int? subscringLength}) {
233+
static CardSystemData? getCardSystemDataByNumber(
234+
String cardNumber, {
235+
int? subscringLength,
236+
}) {
235237
if (cardNumber.isEmpty) return null;
236238
subscringLength = subscringLength ?? cardNumber.length;
237239

238240
if (subscringLength < 1) return null;
239-
var systemCode = cardNumber.substring(0, subscringLength);
240-
241-
var rawData = _data.firstWhere((Map<String, dynamic>? data) {
242-
if (data != null) {
243-
var numericValue = toNumericString(data['systemCode']);
244-
var numDigits = data['numDigits'];
245-
return numericValue == systemCode &&
246-
numDigits >= cardNumber.length &&
247-
numDigits <= _maxDigitsInCard;
241+
Map? rawData;
242+
List<Map> tempSystems = [];
243+
for (var data in _data) {
244+
final systemCode = data['systemCode'];
245+
if (cardNumber.startsWith(systemCode)) {
246+
tempSystems.add(data);
248247
}
249-
return false;
250-
}, orElse: () => null);
251-
if (rawData != null) {
252-
return CardSystemData.fromMap(rawData);
253248
}
254-
return getCardSystemDataByNumber(
255-
cardNumber,
256-
subscringLength: subscringLength - 1,
257-
);
258-
}
249+
if (tempSystems.isEmpty) {
250+
return null;
251+
}
252+
if (tempSystems.length == 1) {
253+
rawData = tempSystems.first;
254+
} else {
255+
tempSystems.sort((a, b) => b['systemCode'].compareTo(a['systemCode']));
256+
final int maxCodeLength = tempSystems.first['systemCode'].length;
257+
tempSystems = tempSystems
258+
.where(
259+
(e) => e['systemCode'].length == maxCodeLength,
260+
)
261+
.toList();
259262

260-
static int get _maxDigitsInCard {
261-
return _data.map((data) {
262-
int numDigits = data!['numDigits'];
263-
return numDigits;
264-
}).reduce(max);
263+
tempSystems.sort((a, b) => a['systemCode'].compareTo(b['systemCode']));
264+
for (var data in tempSystems) {
265+
final int numMaskDigits = data['numDigits']!;
266+
if (cardNumber.length <= numMaskDigits) {
267+
rawData = data;
268+
break;
269+
}
270+
}
271+
if (rawData == null) {
272+
rawData = tempSystems.last;
273+
}
274+
}
275+
return CardSystemData.fromMap(rawData);
265276
}
266277

267-
static List<Map<String, dynamic>?> _data = <Map<String, dynamic>?>[
278+
static List<Map<String, dynamic>> _data = <Map<String, dynamic>>[
268279
{
269280
'system': CardSystem.VISA,
270281
'systemCode': '4',
@@ -327,16 +338,16 @@ class _CardSystemDatas {
327338
},
328339
{
329340
'system': CardSystem.JCB,
330-
'systemCode': '3589',
331-
'numberMask': '0000 0000 0000 0000 000',
332-
'numDigits': 19,
333-
},
334-
{
335-
'system': CardSystem.JCB,
336-
'systemCode': '3528',
341+
'systemCode': '35',
337342
'numberMask': '0000 0000 0000 0000',
338343
'numDigits': 16,
339344
},
345+
// {
346+
// 'system': CardSystem.JCB,
347+
// 'systemCode': '35',
348+
// 'numberMask': '0000 0000 0000 0000 000',
349+
// 'numDigits': 19,
350+
// },
340351
{
341352
'system': CardSystem.DISCOVER,
342353
'systemCode': '60',

lib/formatters/formatter_utils.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,11 @@ String toCurrencyString(
499499
String trailingSymbol = '',
500500
bool useSymbolPadding = false,
501501
}) {
502+
bool isNegative = false;
503+
if (value.startsWith('-')) {
504+
value = value.replaceAll(RegExp(r'^[-+]+'), '');
505+
isNegative = true;
506+
}
502507
value = value.replaceAll(_spaceRegex, '');
503508
if (value.isEmpty) {
504509
value = '0';
@@ -654,6 +659,9 @@ String toCurrencyString(
654659
}
655660
}
656661
value = sb.toString();
662+
if (isNegative) {
663+
return '-$value';
664+
}
657665
return value;
658666
}
659667

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: flutter_multi_formatter
22
description: A package of formatters for international phone numbers, credit / debit cards and a masked formatter
3-
version: 2.10.1
3+
version: 2.10.2
44
homepage: https://github.com/caseyryan/flutter_multi_formatter
55

66
environment:

0 commit comments

Comments
 (0)