Skip to content

Commit 613ef03

Browse files
committed
Improved IBAN validator
Switched to piecewise calculation as described here: https://en.wikipedia.org/wiki/International_Bank_Account_Number#Validating_the_IBAN
1 parent 0a3c4d3 commit 613ef03

File tree

2 files changed

+27
-7
lines changed

2 files changed

+27
-7
lines changed

QRCoder/PayloadGenerator.cs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2410,7 +2410,7 @@ public override string ToString()
24102410
_sb.AppendFormat("{0:000}", CalculateChecksum()).Append('\n');
24112411
return _sb.ToString();
24122412
}
2413-
}
2413+
}
24142414

24152415
private static bool IsValidIban(string iban)
24162416
{
@@ -2419,14 +2419,20 @@ private static bool IsValidIban(string iban)
24192419

24202420
//Check for general structure
24212421
var structurallyValid = Regex.IsMatch(ibanCleared, @"^[a-zA-Z]{2}[0-9]{2}([a-zA-Z0-9]?){16,30}$");
2422-
2422+
24232423
//Check IBAN checksum
2424+
var checksumValid = false;
24242425
var sum = $"{ibanCleared.Substring(4)}{ibanCleared.Substring(0, 4)}".ToCharArray().Aggregate("", (current, c) => current + (char.IsLetter(c) ? (c - 55).ToString() : c.ToString()));
2425-
decimal sumDec;
2426-
if (!decimal.TryParse(sum, out sumDec))
2427-
return false;
2428-
var checksumValid = (sumDec % 97) == 1;
2429-
2426+
int m = 0;
2427+
for (int i = 0; i < (int)Math.Ceiling((sum.Length - 2) / 7d); i++){
2428+
var offset = (i == 0 ? 0 : 2);
2429+
var start = i * 7 + offset;
2430+
var n = (i == 0 ? "" : m.ToString()) + sum.Substring(start, Math.Min(9 - offset, sum.Length - start));
2431+
if (!int.TryParse(n, NumberStyles.Any, CultureInfo.InvariantCulture, out m))
2432+
break;
2433+
m = m % 97;
2434+
}
2435+
checksumValid = m == 1;
24302436
return structurallyValid && checksumValid;
24312437
}
24322438

QRCoderTests/PayloadGeneratorTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2104,6 +2104,20 @@ public void swissqrcode_generator_should_generate_iban()
21042104
.ShouldBe("CH2609000000857666015");
21052105
}
21062106

2107+
[Fact]
2108+
[Category("PayloadGenerator/SwissQrCode.Iban")]
2109+
public void swissqrcode_generator_should_generate_iban_2()
2110+
{
2111+
var iban = "CH47048350000GABRIELS";
2112+
var ibanType = PayloadGenerator.SwissQrCode.Iban.IbanType.Iban;
2113+
2114+
var generator = new PayloadGenerator.SwissQrCode.Iban(iban, ibanType);
2115+
2116+
generator
2117+
.ToString()
2118+
.ShouldBe("CH47048350000GABRIELS");
2119+
}
2120+
21072121
[Fact]
21082122
[Category("PayloadGenerator/SwissQrCode.Iban")]
21092123
public void swissqrcode_generator_should_generate_iban_qr()

0 commit comments

Comments
 (0)