gpt4 book ai didi

winapi - 让 NUMBERFMT 填充默认值的简单方法?

转载 作者:行者123 更新时间:2023-12-02 02:42:41 27 4
gpt4 key购买 nike

我正在使用 Windows API GetNumberFormatEx使用当前用户的适当本地化选项来格式化一些数字以进行显示(例如,确保它们在正确的位置具有正确的分隔符)。当您想要精确的用户默认值时,这是微不足道的。

但在某些情况下,我有时必须覆盖基数分隔符后的位数。这需要提供 NUMBERFMT结构。我想要做的是调用一个 API,该 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 已经可以做到这一点吗?

最佳答案

我上周刚刚编写了一些代码来执行此操作。唉,好像没有 GetDefaultNumberFormat(LCID lcid, NUMBERFMT* fmt) 函数;你必须自己编写它,因为你已经开始了。附带说明一下,分组字符串具有明确定义的格式,可以轻松解析;您当前的代码对于“3”来说是错误的(应该是 30),并且显然会在更奇特的分组上失败(尽管这可能并不是什么大问题,真的)。

关于winapi - 让 NUMBERFMT 填充默认值的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7214669/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com