using UnityEngine;
using static System.String;
namespace RR.Common.Utility
{
///
/// Утилитарный класс для работы с номерами телефонов.
/// Предоставляет методы для валидации и форматирования телефонных номеров.
///
public static class PhoneNumberUtils
{
///
/// Валидирует номер телефона и возвращает только цифры без кода страны.
/// Поддерживает российские номера, начинающиеся с 7 или 8.
///
/// Исходный номер телефона в любом формате (может содержать пробелы, дефисы и другие символы).
///
/// Строка из 10 цифр, представляющая номер без кода страны.
/// Возвращает пустую строку, если формат номера неверный.
///
///
/// Принимаемые форматы:
/// - 11 цифр, начинающиеся с 7 или 8 (например, 89001234567 или 79001234567)
/// - 10 цифр без кода страны (например, 9001234567)
/// При неверном формате выводится предупреждение в консоль Unity.
///
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..];
}
if (digitsOnly.Length == 10)
{
return digitsOnly;
}
else
{
// Неверный формат, возвращаем номер по умолчанию
Debug.LogWarning($"Неверный формат номера телефона: {number}. Заменяю на номер по умолчанию.");
return Empty;
}
}
///
/// Применяет маску форматирования к номеру телефона.
///
/// Номер телефона для форматирования.
/// Маска форматирования. По умолчанию "+7XXXXXXXXXX".
/// Символ-заполнитель в маске, который будет заменен на цифры. По умолчанию 'X'.
///
/// Отформатированный номер телефона согласно маске.
/// Если номер невалиден, возвращается пустая строка.
///
///
/// Метод сначала валидирует номер с помощью ValidatePhoneNumber, затем применяет маску.
/// Символы маски, не являющиеся заполнителями, остаются без изменений.
///
///
/// ApplyPhoneMask("89001234567", "+7 (XXX) XXX-XX-XX") вернет "+7 (900) 123-45-67"
///
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);
}
}
}