85 lines
4.4 KiB
C#
85 lines
4.4 KiB
C#
using UnityEngine;
|
||
using static System.String;
|
||
|
||
namespace RR.Common.Utility
|
||
{
|
||
/// <summary>
|
||
/// Утилитарный класс для работы с номерами телефонов.
|
||
/// Предоставляет методы для валидации и форматирования телефонных номеров.
|
||
/// </summary>
|
||
public static class PhoneNumberUtils
|
||
{
|
||
/// <summary>
|
||
/// Валидирует номер телефона и возвращает только цифры без кода страны.
|
||
/// Поддерживает российские номера, начинающиеся с 7 или 8.
|
||
/// </summary>
|
||
/// <param name="number">Исходный номер телефона в любом формате (может содержать пробелы, дефисы и другие символы).</param>
|
||
/// <returns>
|
||
/// Строка из 10 цифр, представляющая номер без кода страны.
|
||
/// Возвращает пустую строку, если формат номера неверный.
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// Принимаемые форматы:
|
||
/// - 11 цифр, начинающиеся с 7 или 8 (например, 89001234567 или 79001234567)
|
||
/// - 10 цифр без кода страны (например, 9001234567)
|
||
/// При неверном формате выводится предупреждение в консоль Unity.
|
||
/// </remarks>
|
||
public static string ValidatePhoneNumber(string number)
|
||
{
|
||
// Оставляем только цифры
|
||
string digitsOnly = System.Text.RegularExpressions.Regex.Replace(number, @"\D", "");
|
||
|
||
// Проверяем формат
|
||
if ((digitsOnly.StartsWith("8") || digitsOnly.StartsWith("7")) && digitsOnly.Length == 11)
|
||
{
|
||
return digitsOnly[1..];
|
||
}
|
||
else if (digitsOnly.Length == 10)
|
||
{
|
||
return digitsOnly;
|
||
}
|
||
else
|
||
{
|
||
// Неверный формат, возвращаем номер по умолчанию
|
||
Debug.LogWarning($"Неверный формат номера телефона: {number}. Заменяю на номер по умолчанию.");
|
||
return Empty;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// Применяет маску форматирования к номеру телефона.
|
||
/// </summary>
|
||
/// <param name="number">Номер телефона для форматирования.</param>
|
||
/// <param name="mask">Маска форматирования. По умолчанию "+7XXXXXXXXXX".</param>
|
||
/// <param name="maskPlaceholder">Символ-заполнитель в маске, который будет заменен на цифры. По умолчанию 'X'.</param>
|
||
/// <returns>
|
||
/// Отформатированный номер телефона согласно маске.
|
||
/// Если номер невалиден, возвращается пустая строка.
|
||
/// </returns>
|
||
/// <remarks>
|
||
/// Метод сначала валидирует номер с помощью ValidatePhoneNumber, затем применяет маску.
|
||
/// Символы маски, не являющиеся заполнителями, остаются без изменений.
|
||
/// </remarks>
|
||
/// <example>
|
||
/// ApplyPhoneMask("89001234567", "+7 (XXX) XXX-XX-XX") вернет "+7 (900) 123-45-67"
|
||
/// </example>
|
||
public static string ApplyPhoneMask(string number, string mask = "+7XXXXXXXXXX", char maskPlaceholder = 'X')
|
||
{
|
||
string digitsOnly = ValidatePhoneNumber(number);
|
||
if (IsNullOrEmpty(digitsOnly))
|
||
return Empty;
|
||
|
||
char[] maskedNumber = mask.ToCharArray();
|
||
int digitIndex = 0;
|
||
|
||
for (int i = 0; i < maskedNumber.Length; i++)
|
||
{
|
||
if (maskedNumber[i] != maskPlaceholder || digitIndex >= digitsOnly.Length) continue;
|
||
maskedNumber[i] = digitsOnly[digitIndex];
|
||
digitIndex++;
|
||
}
|
||
|
||
return new string(maskedNumber);
|
||
}
|
||
}
|
||
} |