Skip to content

Commit

Permalink
Fixed #113
Browse files Browse the repository at this point in the history
  • Loading branch information
caseyryan committed Jan 16, 2023
1 parent 4c47366 commit 5d9eba6
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 35 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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]
Expand Down
5 changes: 5 additions & 0 deletions example/lib/pages/credit_card_format_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ class _CreditCardFormatPageState extends State<CreditCardFormatPage> {

@override
Widget build(BuildContext context) {
final negativeString = toCurrencyString(
'-888',
mantissaLength: 2,
);
print(negativeString);
return Unfocuser(
child: Scaffold(
appBar: AppBar(
Expand Down
2 changes: 1 addition & 1 deletion example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
77 changes: 44 additions & 33 deletions lib/formatters/credit_card_number_input_formatter.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, dynamic>? data) {
if (data != null) {
var numericValue = toNumericString(data['systemCode']);
var numDigits = data['numDigits'];
return numericValue == systemCode &&
numDigits >= cardNumber.length &&
numDigits <= _maxDigitsInCard;
Map? rawData;
List<Map> 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<Map<String, dynamic>?> _data = <Map<String, dynamic>?>[
static List<Map<String, dynamic>> _data = <Map<String, dynamic>>[
{
'system': CardSystem.VISA,
'systemCode': '4',
Expand Down Expand Up @@ -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',
Expand Down
8 changes: 8 additions & 0 deletions lib/formatters/formatter_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -654,6 +659,9 @@ String toCurrencyString(
}
}
value = sb.toString();
if (isNegative) {
return '-$value';
}
return value;
}

Expand Down
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -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:
Expand Down

0 comments on commit 5d9eba6

Please sign in to comment.