我正在使用Windows API GetNumberFormatEx 来格式化一些数字,以便与当前用户的区域设置相匹配(例如,确保在正确的位置使用正确的分隔符)。 如果您需要完全按照用户默认设置,则此操作很简单。
但是,在某些情况下,我有时必须覆盖小数点后的数字位数。 这需要提供一个NUMBERFMT结构。 我想做的是调用一个API,返回填充了适当默认值的NUMBERFMT,然后仅覆盖我需要更改的字段。 但似乎没有API可以获取默认值。
目前,我一遍又一遍地调用GetLocaleInfoEx,然后将该数据转换为NUMBERFMT所需的格式。
难道没有已经能做到这一点的API吗?
但是,在某些情况下,我有时必须覆盖小数点后的数字位数。 这需要提供一个NUMBERFMT结构。 我想做的是调用一个API,返回填充了适当默认值的NUMBERFMT,然后仅覆盖我需要更改的字段。 但似乎没有API可以获取默认值。
目前,我一遍又一遍地调用GetLocaleInfoEx,然后将该数据转换为NUMBERFMT所需的格式。
NUMBERFMT fmt = {0};
::GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT,
LOCALE_IDIGITS | LOCALE_RETURN_NUMBER,
reinterpret_cast<LPWSTR>(&fmt.NumDigits),
sizeof(fmt.NumDigits)/sizeof(WCHAR));
::GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT,
LOCALE_ILZERO | LOCALE_RETURN_NUMBER,
reinterpret_cast<LPWSTR>(&fmt.LeadingZero),
sizeof(fmt.LeadingZero)/sizeof(WCHAR));
WCHAR szGrouping[32] = L"";
::GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SGROUPING, szGrouping,
ARRAYSIZE(szGrouping));
if (::lstrcmp(szGrouping, L"3;0") == 0 ||
::lstrcmp(szGrouping, L"3") == 0
) {
fmt.Grouping = 3;
} else if (::lstrcmp(szGrouping, L"3;2;0") == 0) {
fmt.Grouping = 32;
} else {
assert(false); // unexpected grouping string
}
WCHAR szDecimal[16] = L"";
::GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SDECIMAL, szDecimal,
ARRAYSIZE(szDecimal));
fmt.lpDecimalSep = szDecimal;
WCHAR szThousand[16] = L"";
::GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_STHOUSAND, szThousand,
ARRAYSIZE(szThousand));
fmt.lpThousandSep = szThousand;
::GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT,
LOCALE_INEGNUMBER | LOCALE_RETURN_NUMBER,
reinterpret_cast<LPWSTR>(&fmt.NegativeOrder),
sizeof(fmt.NegativeOrder)/sizeof(WCHAR));
难道没有已经能做到这一点的API吗?