diff --git a/src/SharedKernel/Helpers/PhoneUtil.cs b/src/SharedKernel/Helpers/PhoneUtil.cs index 4961809..1884bbb 100644 --- a/src/SharedKernel/Helpers/PhoneUtil.cs +++ b/src/SharedKernel/Helpers/PhoneUtil.cs @@ -14,7 +14,6 @@ public static bool TryFormatArmenianMsisdn(string? input, out string? formatted) var s = input.Trim(); - // Special-case exact "(374)" prefix if (s.StartsWith("(374)", StringComparison.Ordinal)) { var rest = DigitsOnly(s.AsSpan(5)); @@ -28,7 +27,6 @@ public static bool TryFormatArmenianMsisdn(string? input, out string? formatted) return false; } - // General tolerant parse: allow spaces, dashes, dots, parentheses; '+' only at start var sb = new StringBuilder(s.Length); for (var i = 0; i < s.Length; i++) { @@ -58,6 +56,8 @@ public static bool TryFormatArmenianMsisdn(string? input, out string? formatted) ReadOnlySpan last8; var plusAtStart = s[0] == '+'; + var doubleZeroAtStart = s.StartsWith("00", StringComparison.Ordinal); + if (plusAtStart) { if (span.Length == 11 && span.StartsWith("374".AsSpan())) @@ -72,20 +72,36 @@ public static bool TryFormatArmenianMsisdn(string? input, out string? formatted) } else { - switch (span.Length) + // Handle "00" international prefix for Armenia: "00374" + 8 digits => total 13 digits + if (doubleZeroAtStart && span.Length == 13 && span.StartsWith("00374".AsSpan())) + { + last8 = span[5..]; // skip "00" + "374" + } + else { - case 11 when span.StartsWith("374".AsSpan()): - last8 = span[3..]; - break; - case 9 when span[0] == '0': - last8 = span[1..]; - break; - case 8: - last8 = span; - break; - default: - formatted = input; - return false; + switch (span.Length) + { + case 11 when span.StartsWith("374".AsSpan()): + { + last8 = span[3..]; + break; + } + case 9 when span[0] == '0': + { + last8 = span[1..]; + break; + } + case 8: + { + last8 = span; + break; + } + default: + { + formatted = input; + return false; + } + } } } diff --git a/src/SharedKernel/SharedKernel.csproj b/src/SharedKernel/SharedKernel.csproj index 41f0bca..362350d 100644 --- a/src/SharedKernel/SharedKernel.csproj +++ b/src/SharedKernel/SharedKernel.csproj @@ -8,7 +8,7 @@ Readme.md Pandatech MIT - 1.6.5 + 1.6.6 Pandatech.SharedKernel Pandatech Shared Kernel Library Pandatech, shared kernel, library, OpenAPI, Swagger, utilities, scalar diff --git a/test/SharedKernel.Tests/PhoneUtilTests.cs b/test/SharedKernel.Tests/PhoneUtilTests.cs index 0faca2f..fde30cc 100644 --- a/test/SharedKernel.Tests/PhoneUtilTests.cs +++ b/test/SharedKernel.Tests/PhoneUtilTests.cs @@ -5,12 +5,14 @@ namespace SharedKernel.Tests; public class PhoneUtilTests { [Theory] + [InlineData("0037493910593", "+37493910593")] [InlineData("+37493910593", "+37493910593")] [InlineData("37493910593", "+37493910593")] [InlineData("093910593", "+37493910593")] [InlineData("93910593", "+37493910593")] [InlineData("(374)93910593", "+37493910593")] // tolerant separators + [InlineData("00 374 93 910-593", "+37493910593")] [InlineData("+374 93 910 593", "+37493910593")] [InlineData("374-93-910-593", "+37493910593")] [InlineData("(374) 93 910 593", "+37493910593")] @@ -24,6 +26,10 @@ public void Formats_Armenian_Numbers_When_Valid(string input, string expected) [Theory] [InlineData("+12025550199")] // foreign [InlineData("441234567890")] // foreign + [InlineData("+7123-4567-901")] // Russian 1 + [InlineData("+71234567901")] // Russian 2 + [InlineData("+7 123 4567 901")] // Russian 2 + [InlineData("+7-123-4567-901")] // Russian 3 [InlineData("+++37493910593")] // invalid [InlineData("37493A10593")] // invalid char [InlineData("(374)1234567")] // only 7 digits after prefix