c – 浮动到std :: string转换和本地化

c – 浮动到std :: string转换和本地化,第1张

概述从float到std :: string的转换是否会受到当前系统区域设置的影响? 我想知道上面的代码是否可以在Germal语言环境下以“1234,5678”而不是“1234.5678”的形式产生输出,例如: std::string MyClass::doubleToString(double value) const{ char fmtbuf[256], buf[256]; sn 从float到std :: string的转换是否会受到当前系统区域设置的影响?

我想知道上面的代码是否可以在Germal语言环境下以“1234,5678”而不是“1234.5678”的形式产生输出,例如:

std::string MyClass::doubletoString(double value) const{    char fmtbuf[256],buf[256];    snprintf(fmtbuf,sizeof(fmtbuf)-1,"%s",getDoubleFormat().c_str());    fmtbuf[sizeof(fmtbuf)-1] = 0;    snprintf(buf,sizeof(buf)-1,fmtbuf,value);    buf[sizeof(buf)-1] = 0;    return std::string(buf);}static std::string const& getDoubleFormat() { return "%f"; }

如果是,如何防止这种情况?如何在表单中输出:“1234.5678”用点来分隔小数?

解决方法 标准C库的 <locale>本地化会影响
格式化输入/输出 *** 作及其字符转换规则和数字格式设置中的小数点字符集.

// On program startup,the locale selected is the "C" standard locale,(equivalent to english). printf("Locale is: %s\n",setlocale(LC_ALL,NulL));cout << doubletoString(3.14)<<endl;// Switch to system specific locale setlocale(LC_ALL,"");  // depends on your environment settings. printf("Locale is: %s\n",NulL));cout << doubletoString(3.14) << endl;printf("Locale is: %c\n",localeconv()->thousands_sep);printf("Decimal separator is: %s\n",localeconv()->decimal_point); // get the point

结果是:

Locale is: C3.140000Locale is: french_France.12523,140000Decimal separator is:,

如果您选择C格式化功能,那么C++ <locale>功能更强大,更灵活.但请注意,C语言环境的设置不会影响C语言环境:

cout << 3.14<<" "<<endl;   // it's still the "C" local cout.imbue(locale(""));    // you can set the locale only for one stream if desiredcout << 3.14 << " "<<1000000<< endl; // localized output

备注:

以下是一个问题:

static std::string const& getDoubleFormat() { return "%f"; }

该函数应返回对字符串的引用.不幸的是,你返回一个字符串文字“%f”,其类型为const char [3].这意味着存在一个隐式转换,它将从const char *构造一个临时字符串并返回其引用.但临时对象在表达式结束时被销毁,因此返回的引用不再有效!

为了测试,我按价值返回.

总结

以上是内存溢出为你收集整理的c – 浮动到std :: string转换和本地化全部内容,希望文章能够帮你解决c – 浮动到std :: string转换和本地化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1227443.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存