我将数据写入可在多台计算机上打开的文件中。问题是当我使用"%f"格式化浮点数时格式化标记,printf
函数的变体wprintf
,CString::Format
,StringCchPrintf
等)使其特定于区域设置。
例如:
double f = 1.5;
WCHAR buff[256];
StringCchPrintf(buff, 256, L"%f", f);
将为美国英语输出"1.5"
,但可能会为某些欧洲语言环境输出"1,5"
等。
所以我很好奇是否有%f
以外的标志只会输出一种格式的浮点数? (最好是英文。)
答案 0 :(得分:2)
考虑到此问题已标记为C ++:使用std::num_put
和std::numpunct
的格式设置”C”
语言环境。最简单的方法是使用合适的std::ostream
和imbue()
std::locale::classic()
。
评论建议编写自己的转换函数:我建议不要这样做,因为正确实现此转换非常重要。请参阅How to Print Floating-Point Numbers Accurately。
答案 1 :(得分:0)
在致电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
}
我们可以使用例如下一个Language Strings。但是存在多种使用区域设置字符串的方法
答案 2 :(得分:0)
在程序中尝试以下操作:
setlocale (LC_ALL, "en_US.UTF-8");
或在程序启动之前设置环境变量:
export LC_NUMERIC="en_US.UTF-8";