Danro/Assets/Scripts/Utilities/PhoneNumberUtils.cs

85 lines
4.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}
}