Danro/Assets/Scripts/Utilities/PhoneNumberUtils.cs
Danil Iarosh 2417f58f61
Some checks failed
Gitea Actions Demo / Explore-Gitea-Actions (push) Has been cancelled
feat: Add text input system and balance management with settings improvements
- Добавлена система ввода текста через модальное окно с ячейками для аркадного автомата
- Реализован TextInputModal с поддержкой кастомных алфавитов и навигации
- Добавлен TextInputCell для ввода отдельных символов с циклической навигацией
- Создан TextInputSettingsBinder для интеграции ввода текста с системой настроек
- Реализована компактная сериализация настроек (только нужные поля в JSON)

- Внедрена система баланса игрока (BalanceManager)
- Баланс начисляется при оплате импульсом, списывается при начале/продолжении игры
- Добавлен InactivityManager для выхода в меню при отсутствии активности (5 минут)

- Улучшена система настроек
- Добавлены флаги shownInSettings и exposed для управления видимостью настроек
- Реализована автоматическая регистрация/отписка SettingsButtonBinder при активации/деактивации
- Исправлена загрузка настроек с проверкой типов через Sanitize()
- SettingsApplier упрощен - оставлена только поддержка AudioManager
- Добавлен ValueSelectorRow для выбора целочисленных значений с шагом

- Удалены примеры и документация из production кода (QUICK_SETUP.md, TextInputExample, AdvancedLoggingExample)
- Убран весь отладочный вывод Debug.Log из системы настроек и ввода текста
- Очищены неразрывные пробелы из файлов проекта
- Добавлены префабы UI (InputCell)
2026-02-11 16:27:33 +03:00

91 lines
4.6 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("+") && digitsOnly.Length == 12)
{
return digitsOnly[2..];
}
// Проверяем формат
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;
}
}
/// <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);
}
}
}