Простой способ заполнить NUMBERFMT значениями по умолчанию? - PullRequest
3 голосов
/ 27 августа 2011

Я использую Windows API GetNumberFormatEx для форматирования некоторых чисел для отображения с соответствующими вариантами локализации для текущего пользователя (например, чтобы убедиться, что у них правильные разделители в нужных местах).Это тривиально, когда вы хотите точно указать пользовательское значение по умолчанию.

Но в некоторых случаях мне иногда приходится переопределять количество цифр после разделителя радиусов.Это требует предоставления структуры NUMBERFMT .Я хотел бы вызвать API, который возвращает NUMBERFMT, заполненный соответствующими значениями по умолчанию для пользователя, а затем переопределить только те поля, которые мне нужно изменить.Но, похоже, нет API для получения значений по умолчанию.

В настоящее время я снова и снова вызываю GetLocaleInfoEx, а затем транслирую эти данные в форму, требуемую NUMBERFMT.* Разве нет API, который уже делает это?

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

Я только что написал код, чтобы сделать это на прошлой неделе.Увы, похоже, нет функции GetDefaultNumberFormat (LCID lcid, NUMBERFMT * fmt);Вы должны будете написать это самостоятельно, поскольку вы уже начали.Кстати, строка группировки имеет четко определенный формат, который может быть легко проанализирован;Ваш текущий код неверен для «3» (должно быть 30) и, очевидно, не сработает в более экзотических группах (хотя на самом деле это не так уж и важно).

0 голосов
/ 26 октября 2015

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

#define cut_off_decimals(sz, cch) \
    if (cch >= 5 && (sz[cch-4] == _T('.') || sz[cch-4] == _T(','))) \
        sz[cch-4] = _T('\0');

(Венгерское предупреждение: sz - это строка C, cch - количество символов, включая завершающий нулевой байт. И _T - это общий текстовый макрос Windows для char или wchar_t в зависимости от того, UNICODE определен, необходим только для совместимости с Windows 9x / ME.)

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

И, конечно, это ничего не изменит, если символ от третьего до последнего не является ни точкой, ни запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...