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

时间:2018-02-24 22:45:01

标签: c++ winapi visual-studio-2008 floating-point printf

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

例如:

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

将为美国英语输出"1.5",但可能会为某些欧洲语言环境输出"1,5"等。

所以我很好奇是否有%f以外的标志只会输出一种格式的浮点数? (最好是英文。)

3 个答案:

答案 0 :(得分:2)

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