C++ printf输出不受全局区域设置的影响?
我无法让Visual C++(VS 2005)中的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
printf
函数在整数中输出数千个分隔符
注:注释表明这是printf的正常行为。但是,C++ iOSWATE确实把成千上万的分隔符插入到数字中(用<代码> STD::StrugSuth和 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.普劳格
让我在这里分享我学到的东西:
locale确实包含有关千位分隔符的信息,但此信息是由C
函数系列提供的(除非您计算printf*
,它在MSVC中无论如何都不存在)”
locale也包含这些信息,iostreams在格式化数字()时实际上会使用这些信息C++
- 使用
设置全局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让我在这里分享我学到的东西:
locale确实包含有关千位分隔符的信息,但此信息是由C
函数系列提供的(除非您计算printf*
,它在MSVC中无论如何都不存在)”
locale也包含这些信息,iostreams在格式化数字()时实际上会使用这些信息C++
- 使用
设置全局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