localeconv()
函数只是读取本地设置,而ptrLocale->thousands_sep
本身不会更改当前区域设置。
编辑:
我不知道如何在C语言中实现这个功能,但是可以找到很多C++输出的示例。
请查看以下C++示例:
#include <iostream>
#include <locale>
using namespace std;
struct myseps : numpunct<char> {
char do_thousands_sep() const { return '\''; }
string do_grouping() const { return "\3"; }
};
int main() {
cout.imbue(locale(locale(), new myseps));
cout << 1234567;
}
编辑2:
C++参考文献中提到:
localeconv()返回一个填充好的struct lconv对象指针。对象中包含的值可以被后续调用localeconv覆盖,并且不会直接修改该对象。使用类别值为LC_ALL、LC_MONETARY或LC_NUMERIC的setlocale调用会覆盖结构体的内容。
我在MS Visual Studio 2012中尝试了以下示例(我知道这是一种不好且不安全的风格):
#include <stdio.h>
#include <locale.h>
#include <string.h>
int main() {
setlocale(LC_NUMERIC, "");
struct lconv *ptrLocale = localeconv();
strcpy(ptrLocale->decimal_point, ":");
strcpy(ptrLocale->thousands_sep, "'");
char str[20];
printf("%10.3lf \n", 13000.26);
return 0;
}
我看到了结果:
13000:260
因此,可以假设通过使用
localeconv()
接收的指针可以改变
decimal_point
和
thousands_sep
的值,但
printf
会忽略
thousands_sep
。
编辑 3:
更新了C++示例:
#include <iostream>
#include <locale>
#include <sstream>
using namespace std;
struct myseps : numpunct<char> {
char do_thousands_sep() const { return '\''; }
string do_grouping() const { return "\3"; }
};
int main() {
stringstream ss;
ss.imbue(locale(locale(), new myseps));
ss << 1234567;
printf("%s\n", ss.str().c_str());
}