私のブログをようこそ。

[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 SymbolsNumbers and Digits… Забавно, и правда что, юникод не считает вышеозначенные идеограммы числами.

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

Исходник лежит здесь: NumberConverter.cs. Не самое элегантное решение, зато достаточно компактное. Да, игнорирует отрицательные числа (ну не надо мне это), да работает для чисел до 999999999999999 включительно, хотя мне надо только от 1 до 9 (^_^)"… главное, что работает 🙂


Comments

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *