C++ printf输出不受全局区域设置的影响?

C++ printf输出不受全局区域设置的影响?,c++,c,visual-c++,internationalization,locale,C++,C,Visual C++,Internationalization,Locale,我无法让Visual C++(VS 2005)中的printf函数在整数中输出数千个分隔符 注:注释表明这是printf的正常行为。但是,C++ iOSWATE确实把成千上万的分隔符插入到数字中(用 STD::StrugSuth和 IbBue >进行测试,所以这是IOFROWS的纯特性,而不存在于“C”格式函数中吗? 以下是测试代码: setlocale(LC_ALL, ""); // -> User locale _locale_t loc = _create_local

我无法让Visual C++(VS 2005)中的
printf
函数在整数中输出数千个分隔符

注:注释表明这是printf的正常行为。但是,C++ iOSWATE确实把成千上万的分隔符插入到数字中(用<代码> STD::StrugSuth和 IbBue<代码> >进行测试,所以这是IOFROWS的纯特性,而不存在于“C”格式函数中吗? 以下是测试代码:

    setlocale(LC_ALL, ""); // -> User locale
    _locale_t loc = _create_locale(LC_ALL, ""); // -> user locale for *_l version

    struct lconv *pLocalSettings = localeconv();
    printf("Locale is: %s\n", setlocale(LC_NUMERIC, NULL));
    printf("Thousands separator set to : {%s}\n", pLocalSettings->thousands_sep);
    printf("Grouping set to: {%o}\n", int(pLocalSettings->grouping[0]));

    int i = 1000000;
    __int64 i64 = i * 2;
    printf("32 Bit integer output: %d\n", i);
    printf("64 Bit integer output: %I64d\n", i64);
    _printf_l("32 Bit integer output: %d\n", /*locale=*/loc, i);
    _printf_l("64 Bit integer output: %I64d\n", /*locale=*/loc, i64);
    _free_locale(loc);
输出为:

Locale is: German_Austria.1252
Thousands separator set to : {.}
Grouping set to: {3}
32 Bit integer output: 1000000
64 Bit integer output: 2000000
32 Bit integer output: 1000000
64 Bit integer output: 2000000
Compiling the source code....
$g++ -std=c++11 main.cpp -o demo -lm -pthread -lgmpxx -lgmp -lreadline 2>&1

Executing the program....
$demo
Locale is: en_US
Thousands separator set to : {,}
Grouping set to: {3}
32 Bit integer output: 1000000
64 Bit integer output: 2000000
经过进一步检查,它似乎不是这样工作的。我试过这个:

#include <iostream>
#include <clocale>
using namespace std;

int main() {
    setlocale(LC_ALL, "en_US"); // -> User locale

    struct lconv *pLocalSettings = localeconv();
    printf("Locale is: %s\n", setlocale(LC_NUMERIC, NULL));
    printf("Thousands separator set to : {%s}\n", pLocalSettings->thousands_sep);
    printf("Grouping set to: {%o}\n", int(pLocalSettings->grouping[0]));

    int i = 1000000;
    long long  i64 = i * 2;
    printf("32 Bit integer output: %d\n", i);
    printf("64 Bit integer output: %I64d\n", i64);

    return 0;
}
我找到了一个文档,上面说区域设置影响
e
e
f
g
,以及
g
转换字符

无论是
o
还是
d
都不使用区域设置转换

我找到了一个文档,上面说语言环境影响
e
e
f
g
,以及
g
转换字符


无论是
o
还是
d
都不使用区域设置转换

在《标准C库》一书的第90-93页,p.J.Plauger介绍了一个名为_Fmtval()的函数的代码,该函数使用localeconv()提供的信息格式化浮点值。调用者指定值的格式是国际货币、本地货币、整数还是带有指定数量分数位数的浮点。部分代码处理数字分组和分隔符的插入。这可以作为编写自己函数的指南

同一作者在以下链接上的文章提供了与本书类似的讨论,并呈现了几乎相同的_Fmtval()版本。不幸的是,本文提供的代码似乎包含一些OCR错误。如果可能的话,参考这本书

标准C:货币值格式,p.J.普劳格


在《标准C库》一书的第90-93页,p.J.Plauger介绍了一个名为_Fmtval()的函数的代码,该函数使用localeconv()提供的信息格式化浮点值。调用者指定值的格式是国际货币、本地货币、整数还是带有指定数量分数位数的浮点。部分代码处理数字分组和分隔符的插入。这可以作为编写自己函数的指南

同一作者在以下链接上的文章提供了与本书类似的讨论,并呈现了几乎相同的_Fmtval()版本。不幸的是,本文提供的代码似乎包含一些OCR错误。如果可能的话,参考这本书

标准C:货币值格式,p.J.普劳格


让我在这里分享我学到的东西:

  • C
    locale确实包含有关千位分隔符的信息,但此信息是由
    printf*
    函数系列提供的(除非您计算
    ,它在MSVC中无论如何都不存在)
  • C++
    locale也包含这些信息,iostreams在格式化数字()时实际上会使用这些信息
  • 使用
    setlocale
    设置全局
    C
    区域设置不会影响
    std::locale::global()

  • 获取格式化数字的正确代码为:

    static std::locale user_locale("");
    std::wstringstream buf; 
    buf.imbue(user_locale); 
    buf << some_integer; 
    
    static std::locale user\u locale(“”);
    std::wstringstream buf;
    buf.imbue(用户/地区);
    
    buf让我在这里分享我学到的东西:

    • C
      locale确实包含有关千位分隔符的信息,但此信息是由
      printf*
      函数系列提供的(除非您计算
      ,它在MSVC中无论如何都不存在)
    • C++
      locale也包含这些信息,iostreams在格式化数字()时实际上会使用这些信息
    • 使用
      setlocale
      设置全局
      C
      区域设置不会影响
      std::locale::global()

    • 获取格式化数字的正确代码为:

      static std::locale user_locale("");
      std::wstringstream buf; 
      buf.imbue(user_locale); 
      buf << some_integer; 
      
      static std::locale user\u locale(“”);
      std::wstringstream buf;
      buf.imbue(用户/地区);
      
      bufOP可能是从C中获取printf与BASH的printf(它确实有一些区域设置功能)混在一起

      (我在CrunchBang 11“Waldorf”上,源于Debian 7“喘息”)

      LANG=en_US.UTF-8
      未设置LC\U数字

      例如:

      $ printf "%d\n" 12345678
      12345678
      $ printf "%'d\n" 12345678
      12,345,678
      


      (请参阅字段和打印修饰符)

      OP可能从C中获取printf,而BASH的printf(它确实具有一些区域设置功能)

      (我在CrunchBang 11“Waldorf”上,源于Debian 7“喘息”)

      LANG=en_US.UTF-8
      未设置LC\U数字

      例如:

      $ printf "%d\n" 12345678
      12345678
      $ printf "%'d\n" 12345678
      12,345,678
      


      (请参阅字段和打印修饰符)

      您确定printf应该做这样的事情吗?我从来都不知道%d在其输出中包含数千个分隔符…@JoeZ-那么做了什么?在收到此问题的满意答案后,您将要编写的自定义函数:)LC\u NUMERIC:确定数字格式的区域设置。此环境变量影响使用e、e、f、g、,和G转换字符。您确定printf应该做这样的事情吗?我从来都不知道%d在其输出中包含数千个分隔符…@JoeZ-那么做了什么?在收到此问题的满意答案后,您将要编写的自定义函数:)LC_NUMERIC:确定数字格式的区域设置。此环境变量影响使用e、e、f、g和g转换字符写入的数字格式。应注意,浮点转换使用的区域设置仅用于十进制分隔符。C-Standard
      printf
      根本不使用千位分组分隔符。怎么