diff --git a/CHANGELOG.md b/CHANGELOG.md index b43bd8ee..d5c1dcba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased - Implement `IParsable` on Iban type in https://github.com/skwasjer/IbanNet/pull/138 +- Implement `BankAccountNumber` on Iban type in https://github.com/skwasjer/IbanNet/pull/394 ## v6.0.0 diff --git a/src/IbanNet/Iban.cs b/src/IbanNet/Iban.cs index 05ba544b..aac03f54 100644 --- a/src/IbanNet/Iban.cs +++ b/src/IbanNet/Iban.cs @@ -78,6 +78,27 @@ internal Iban(string iban, IbanCountry ibanCountry, bool skipNormalize = false) /// public string Bban => Extract(Country.Bban) ?? _iban.Substring(4); + /// + /// Gets the bank account number part of the IBAN. + /// + public string? BankAccountNumber + { + get + { + var result = Extract(Country.BankAccountNumber); + if (result is not null) + { + return result; + } + var bankIdentifier = BankIdentifier; + var branchIdentifier = BranchIdentifier; + if (bankIdentifier is null || branchIdentifier is null) + { + return null; + } + return Bban.Substring(bankIdentifier.Length + branchIdentifier.Length); + } + } /// /// Gets the bank identifier, or if bank identifier cannot be extracted. /// diff --git a/src/IbanNet/Registry/IbanCountry.cs b/src/IbanNet/Registry/IbanCountry.cs index 661b972e..070c5e31 100644 --- a/src/IbanNet/Registry/IbanCountry.cs +++ b/src/IbanNet/Registry/IbanCountry.cs @@ -24,6 +24,8 @@ public sealed class IbanCountry private readonly PatternDescriptor? _bankPatternDescriptor; [DebuggerBrowsable(DebuggerBrowsableState.Never)] private readonly PatternDescriptor? _branchPatternDescriptor; + [DebuggerBrowsable(DebuggerBrowsableState.Never)] + private readonly PatternDescriptor? _bankAccountNumberPatternDescriptor; /// /// Initializes a new instance of the class using specified 2 letter ISO region name. @@ -126,6 +128,16 @@ public PatternDescriptor Branch init => _branchPatternDescriptor = value; } + /// + /// Gets the pattern descriptor for the bank account number identifier. + /// + [AllowNull] + public PatternDescriptor BankAccountNumber + { + get => _bankAccountNumberPatternDescriptor ?? NullPatternDescriptor; + init => _bankAccountNumberPatternDescriptor = value; + } + /// /// Gets when this was last updated in the Iban Registry. /// diff --git a/test/IbanNet.Tests/IbanTests.cs b/test/IbanNet.Tests/IbanTests.cs index 1d69d804..882f6c3e 100644 --- a/test/IbanNet.Tests/IbanTests.cs +++ b/test/IbanNet.Tests/IbanTests.cs @@ -285,6 +285,7 @@ public void Given_that_patternDescriptor_exists_it_should_return_extracted_prope // Act & Assert iban.Bban.Should().Be(ibanCountry.Bban.Example); + iban.BankAccountNumber.Should().Be(ibanCountry.BankAccountNumber.Example); iban.BankIdentifier.Should().Be(ibanCountry.Bank.Example); iban.BranchIdentifier.Should().Be(ibanCountry.Branch.Example); } @@ -309,6 +310,7 @@ public void Given_that_patternDescriptor_is_not_known_it_should_return_null() // Act & Assert iban.Bban.Should().Be(ibanCountry.Bban.Example); + iban.BankAccountNumber.Should().BeNull("no pattern descriptor is available"); iban.BankIdentifier.Should().BeNull("no pattern descriptor is available"); iban.BranchIdentifier.Should().BeNull("no pattern descriptor is available"); } diff --git a/test/IbanNet.Tests/Registry/IbanCountryTests.cs b/test/IbanNet.Tests/Registry/IbanCountryTests.cs index bd9b7007..b562a4f8 100644 --- a/test/IbanNet.Tests/Registry/IbanCountryTests.cs +++ b/test/IbanNet.Tests/Registry/IbanCountryTests.cs @@ -45,6 +45,7 @@ public void Getters_should_return_set_properties() const string twoLetterIsoRegionName = "nl"; var ibanPatternDescriptor = new PatternDescriptor(NullPattern.Instance); var bbanPatternDescriptor = new PatternDescriptor(NullPattern.Instance); + var bankAccountNumberPatternDescriptor = new PatternDescriptor(NullPattern.Instance); var bankPatternDescriptor = new PatternDescriptor(NullPattern.Instance); var branchPatternDescriptor = new PatternDescriptor(NullPattern.Instance); const string displayName = "name"; @@ -59,6 +60,7 @@ public void Getters_should_return_set_properties() { Iban = ibanPatternDescriptor, Bban = bbanPatternDescriptor, + BankAccountNumber = bankAccountNumberPatternDescriptor, Bank = bankPatternDescriptor, Branch = branchPatternDescriptor, DisplayName = displayName, @@ -73,6 +75,7 @@ public void Getters_should_return_set_properties() ibanCountry.TwoLetterISORegionName.Should().Be(twoLetterIsoRegionName.ToUpper()); ibanCountry.Iban.Should().BeSameAs(ibanPatternDescriptor); ibanCountry.Bank.Should().BeSameAs(bankPatternDescriptor); + ibanCountry.BankAccountNumber.Should().BeSameAs(bankAccountNumberPatternDescriptor); ibanCountry.Bban.Should().BeSameAs(bbanPatternDescriptor); ibanCountry.Branch.Should().BeSameAs(branchPatternDescriptor); ibanCountry.DisplayName.Should().Be(displayName); diff --git a/test/IbanNet.Tests/Registry/Swift/SwiftRegistryProviderTests.cs b/test/IbanNet.Tests/Registry/Swift/SwiftRegistryProviderTests.cs index 692e4938..f17da103 100644 --- a/test/IbanNet.Tests/Registry/Swift/SwiftRegistryProviderTests.cs +++ b/test/IbanNet.Tests/Registry/Swift/SwiftRegistryProviderTests.cs @@ -21,6 +21,7 @@ public void When_definitions_are_loaded_should_contain(IbanCountry expectedIbanC actual.Should().BeEquivalentTo(expectedIbanCountry); actual.Iban.Pattern.ToString().Should().Be(expectedIbanCountry.Iban.Pattern.ToString()); actual.Bban.Pattern.ToString().Should().Be(expectedIbanCountry.Bban.Pattern.ToString()); + actual.BankAccountNumber.Pattern.ToString().Should().Be(expectedIbanCountry.BankAccountNumber.Pattern.ToString()); actual.Bank.Pattern.ToString().Should().Be(expectedIbanCountry.Bank.Pattern.ToString()); actual.Branch.Pattern.ToString().Should().Be(expectedIbanCountry.Branch.Pattern.ToString()); }