我正在将数据写入一个可以在多台计算机上打开的文件中。问题是,当我使用"%f"格式标志格式化浮点数时,函数的printf
变体(wprintf
、CString::Format
、StringCchPrintf
等)使其特定于区域设置。
例如:
double f = 1.5;
WCHAR buff[256];
StringCchPrintf(buff, 256, L"%f", f);
将输出美国英语的"1.5"
,但随后可能会输出某些欧洲区域设置等的"1,5"
。
所以我很好奇除了%f
之外是否有一个标志只会以一种格式输出浮点数?(最好是英语。
考虑到这个问题被标记为C++:使用”C”
区域设置的std::num_put
和std::numpunct
格式。最简单的方法是使用合适的std::ostream
并imbue()
std::locale::classic()
。
评论建议编写自己的转换函数:我建议不要这样做,因为正确实现此转换并非易事。了解如何准确打印浮点数。
您需要在呼叫StringCchPrintf
或说_snwprintf
之前呼叫setlocale
或_wsetlocale
。 例如:
WCHAR buf[32];
double f = 1.5;
setlocale(LC_NUMERIC, "english");
_snwprintf(buf, RTL_NUMBER_OF(buf), L"%f", f);
// 1.500000
setlocale(LC_NUMERIC, "German");
_snwprintf(buf, RTL_NUMBER_OF(buf), L"%f", f);
// 1,500000
或者作为替代方案可以使用StringCchPrintf_l
或其他_l功能。 但在这种情况下,您需要调用_create_locale
并_free_locale
WCHAR buf[32];
double f = 1.5;
_locale_t locale;
if (locale = _create_locale(LC_NUMERIC, "German"))
{
_snwprintf_l(buf, RTL_NUMBER_OF(buf), L"%f", locale, f);
_free_locale(locale);
// 1,500000
}
if (locale = _create_locale(LC_NUMERIC, "english"))
{
_snwprintf_l(buf, RTL_NUMBER_OF(buf), L"%f", locale, f);
_free_locale(locale);
// 1.500000
}
例如,我们可以使用下一个语言字符串。 但是存在多种使用区域设置字符串的方法
在程序中尝试以下操作:
setlocale (LC_ALL, "en_US.UTF-8");
或者在程序启动之前设置环境变量:
export LC_NUMERIC="en_US.UTF-8";