[Update] репозиторий на гугле благополучно скончался в связи с полной запущенностью проекта ^_^"
Всем заинтересованным привет.
Сразу же хочется предупредить: дальше [скорее всего] будет текст на английском и японском, так что не пугаться! (Ну, или пугаться, но не сильно ^_^). Собственно, начать бложить потихоньку меня сподвигла нужда в публичном выражении своего раздражения по поводу тех или иных косяков, которые я начал встречать в .NET (и не только) после начала над своим проектом Shogi .NET.
Тема сегодняшнего поста — очередной косяк, отрытый в .NET.
Задача: хочется выводить числа в японской системе записи (т.е. вместо 1,2,3… чтобы в строчку писалось 一、二、三…). Казалось бы, что может быть проще, ведь это национальная система записи чисел — возьмём нужную культуру и применим её при форматировании чисел!
Итак, примерный код должен выглядеть так:
var cultureInfo = new CultureInfo("ja-JP");
var str = string.Format(cultureInfo, "{0}", 100);
Console.WriteLine(str);
После запуска можно убедиться, что ожидаемого эффекта добиться не удалось.
Копаем дальше. У CultureInfo
есть свойство NativeDigits
, которое, как ни странно, ничем не отличается между японской и, например, русской культурой. Но его можно установить руками! Радостно потирая руками, пробуем изобразить нужный код:
var cultureInfo = new CultureInfo("ja-JP") { NumberFormat = new NumberFormatInfo { NativeDigits = new[] { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九" } } }; var str = string.Format(cultureInfo, "{0}", 100); Console.WriteLine(str);
Хм… Runtime exception с какой-то нелепой жалобой, что мы ему вовсе не циферки подсовываем… Смотрим в стандарт Unicode 5.1.0, Mathematical Symbols→Numbers and Digits… Забавно, и правда что, юникод не считает вышеозначенные идеограммы числами.
Что ж, снова придётся всё писать самому. К тому же, заодно можно будет сделать полноценный форматер, который будет генерировать минимальную запись без всяких иностранных нулей 🙂
Исходник лежит здесь: NumberConverter.cs. Не самое элегантное решение, зато достаточно компактное. Да, игнорирует отрицательные числа (ну не надо мне это), да работает для чисел до 999999999999999 включительно, хотя мне надо только от 1 до 9 (^_^)"… главное, что работает 🙂
Добавить комментарий