Я работал над классом C ++ для извлечения чисел произвольного размера из потока и хотел бы использовать фасеты языковой пунктуации. Излишне говорить, что std :: num_get не собирается извлекать мой числовой класс произвольного размера; он извлекает только встроенные типы чисел. Но экстрактор может получить информацию о форматировании от граней numpunct и moneypunct.
Аспект, с которым я сталкиваюсь больше всего, это группировка цифр. Я понимаю, что не все культуры группируют цифры по три, а в некоторых культурах числовые группы различного размера.
Я наткнулся на блог (http://blogs.msdn.com/b/oldnewthing/archive/2006/04/17/577483.aspx), который показывает несколько примеров. Википедия (http://en.wikipedia.org/wiki/Decimal_mark#Examples_of_use) также есть таблица примеров.
Стандарты C и C ++ реализовали способ обработки этого в механизме локали. Но реализации оставляют семантическое пространство для некоторых очень сложных ситуаций. Распознать последовательность цифр, вводимых без конца, когда мы сказали распознавателю требовать правильной группировки цифр, будет чрезвычайно сложно.
Итак, можем ли мы сократить сложность, сделав некоторые предположения? Они происходят от общих черт, которые я наблюдал в приведенных примерах.
(Предположение 1) Только младшая группа цифр может иметь другой размер, и она не может быть меньше размера других групп.
В случае неверного предположения 1 мы можем вернуться к:
(Предположение 2а) Существует не более небольшого количества разных размеров. (Надеюсь 2. Я не видел примеров с более чем двумя разными размерами.)
(Предположение 2b) Группа менее значимых цифр всегда длиннее всех других групп для более значимых цифр.
Меня беспокоило, что никто никогда не обращался к этому, но недавно я наткнулся на консорциум Unicode Общее хранилище данных локали (или же CLDR)
Развернув дальше, я нашел сводную таблицу (Вот) шаблонов форматирования чисел в CLDR. Это содержит два основных шаблона группировки:
#,##,##0.###
: Индийские языки, традиционное использование # ####
: Китайская и японская традиционная (не в CLDR; Я обнаружил это позже) #,##0.###
: все остальныетак что даже мое наивное предположение № 1, сделанное несколько лет назад, дало гораздо больше свободы, чем было необходимо.
Тем не менее, диаграмма форматирования чисел охватывает только базовые 10 современных языков. Например, в него не входят хетты, майя или вавилоняне.
Наконец, я не верю std::num_get
адаптирован к непозиционным обозначениям (например, римские цифры).
Других решений пока нет …