printf 的浮点格式标志 (%f) 仅适用于英文数字格式



我正在将数据写入一个可以在多台计算机上打开的文件中。问题是,当我使用"%f"格式标志格式化浮点数时,函数的printf变体(wprintfCString::FormatStringCchPrintf等)使其特定于区域设置。

例如:

double f = 1.5;
WCHAR buff[256];
StringCchPrintf(buff, 256, L"%f", f);

将输出美国英语的"1.5",但随后可能会输出某些欧洲区域设置等的"1,5"

所以我很好奇除了%f之外是否有一个标志只会以一种格式输出浮点数?(最好是英语。

考虑到这个问题被标记为C++:使用”C”区域设置的std::num_putstd::numpunct格式。最简单的方法是使用合适的std::ostreamimbue()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";

相关内容

  • 没有找到相关文章

最新更新