Выбор даты с не стандартными значениями

radv

Client
Регистрация
11.05.2015
Сообщения
3 855
Благодарностей
2 087
Баллы
113
Всем привет.

В этом посте расскажу как решить проблему с выбором даты, если название месяца написано на иностранном языке. Возможно на полноценную статью это не тянет, но как лайфхак для работы вполне.

Если название месяца написано на популярном языке (русском, английском и т.п.) то с выбором месяца проблем обычно не возникает, а как быть если месяц для выбора предлагается выбрать из не стандартных, иногда даже написанных не латиницей или кириллицей, а иероглифами.

128392


Конечно, можно делать рандомное количество свайпов вверх или вниз, выбирая месяц, но тогда может измениться и год. При рандомном выборе месяца, можно таким же образом спарсить месяц, а потом уже год.

Самый простой вариант это сделать привязку к номеру месяца и создать словарь значений, где для каждого названия месяца указать его номер.

Как это будете делать, через базы данных или текстовые файлы, это уже ваш выбор.

Покажу самый простой вариант с текстовым файлом.

Заполняете 12 строк для каждого языка, который хотите использовать при выборе даты.

Т.е. надо спарсить все названия месяцев из блока с датой и добавить им индексы.

Название месяца и через | его индекс. Без пробелов и лишних символов.

Английский и русский приведены в качестве примера (для разновидности заполнения), их добавлять не обязательно. Можно добавить только нужные языки, которые используете в работе.

Всего в файле должно быть число строк кратное 12 без повторов названий месяцев.

128393
128394
128395


Через код считываем строки из этого файла и заполняем словарь

128400

C#:
// Путь к файлу. например в папке проекта.
string pathFileMonth = Path.Combine(project.Directory, "DicMonth.txt");
// Заполняем словарь месяцевDictionary<string, int> DicMonth = new Dictionary<string, int>();
if (!string.IsNullOrEmpty(pathFileMonth) && File.Exists(pathFileMonth))
{
    // Читаем строки из файла
    string[] listLang = File.ReadAllLines(pathFileMonth);

    if (listLang.Length == 0)
    {// Если файл пустой
        project.SendWarningToLog($"Файл пуст '{pathFileMonth}'", true);
        return "Empty";
    }

    foreach (string line in listLang)
    {// Перебираем строки. Пропускаем пустые.
        if (string.IsNullOrWhiteSpace(line)) continue;
        // Проверяем разделитель в строке
        if (line.Contains("|"))
        {// месяц|индекс например Dec|12
            string[] keys = line.Split(new char[] { '|' }, StringSplitOptions.RemoveEmptyEntries);

            int.TryParse(keys[1], out int num);

            project.SendInfoToLog($"Добавляем {keys[0]}");

            DicMonth.Add(keys[0].ToLower(), num);
        }
        else
        {// Если нет разделителя или неверный формат записи в строке.
            project.SendErrorToLog($"Неверный формат заполнения '{pathFileMonth}'", true);
            break;
        }
    }
  
     // Для поддержки сразу нескольких языков в файле.
    if (DicMonth.Count % 12 != 0)// если есть остаток, будет true)
    {// Ошибка при неверном количестве добавленных строк
        project.SendErrorToLog($"Число строк должно быть кратно 12. Сейчас {DicMonth.Count}. Проверьте количество строк в '{pathFileMonth}'", true);
          throw new Exception();
    }
  
    project.SendInfoToLog($"Успешно заполнили словарь месяцев. строк {DicMonth.Count}");

    project.Context["DicMonth"] = DicMonth;
}
При выборе месяца, парсите текущее значение из аттрибута в дереве элементов из сохраненных файлов

128397


или так через зеннодроид

128403


128398


А из словаря получаете заданный индекс используя код C#

C#:
// Получаем заполненный словарь со значениями
var DicMonth = project.Context["DicMonth"];

// Получаем текущее значение выбранного месяца. например "เม.ย." или "ноябрь" или какое спарсили из кода;
string nameMonth = project.Variables["nameMonth"].Value.ToLower();

// Получаем индекс месяца по его названию
DicMonth.TryGetValue(nameMonth, out int indexMonth);

project.SendInfoToLog($"Индекс {nameMonth} => {indexMonth}");

// Проверяем индекс с нужным
int.TryParse(project.Variables["needMonthIndex"].Value, out int needIndex);

// Определяем завершили выбор или нет. Надо ли еще крутить и в какую сторону
if(indexMonth == 0 || needIndex == 0)
{
    return $"Ошибка получения индекса для {nameMonth}";
}
else if(indexMonth == needIndex)
{
    return "=";
}
// Для switch можете добавить вариантов, чтобы крутить сразу на нужное количество месяцев, а не по одному.
else if(indexMonth > needIndex)
{
    return "вниз";
}
else if(indexMonth < needIndex)
{
    return "вверх";
}
Сравниваете полученный индекс с индексом нужного месяца, и при необходимости делаете свайп в нужную сторону.
После свайпа повторяете получение текущего выбранного месяца и сравнение.
Сохраняете выбранные значения в переменную и используете дальше.

128404


Подробности в прикрепленном проекте для зеннодроид.


 

Вложения

Последнее редактирование модератором:

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)