C++ C++;小数点
我有这个功能:C++ C++;小数点,c++,C++,我有这个功能: #include <cstdlib> #include <clocale> double SimplifiedExample () { setlocale (LC_ALL, ""); char txt [] = "3.14"; for (int x=0; txt [x]; x++) if (txt [x] == '.') txt [x] = localeconv ()->dec
#include <cstdlib>
#include <clocale>
double SimplifiedExample () {
setlocale (LC_ALL, "");
char txt [] = "3.14";
for (int x=0; txt [x]; x++)
if (txt [x] == '.')
txt [x] = localeconv ()->decimal_point [0];
char *endptr;
return strtod (txt, &endptr);
}
#包括
#包括
双重简化示例(){
setlocale(LC_ALL,“”);
字符txt[]=“3.14”;
for(int x=0;txt[x];x++)
如果(txt[x]='.')
txt[x]=localeconv()->小数点[0];
char*endptr;
返回strtod(txt和endptr);
}
这在我试过的每一个Windows10和Linux系统上都有效。它在至少一台Windows 7计算机上失败(该计算机报告“for localeconv()->decimal_point[0],但在sprintf和strtod中都使用“.”)。使用localeconv向strod提供系统小数点是否正确
请注意,我无法删除setlocale()调用。应用程序必须遵守区域设置。您是否尝试过“man strod”?我有Slackware linux,strtod手册页有strtod,其中提到小数点的区域设置,并说它存在于stdlib.h中。您陷入了实现定义行为的泥潭 < >问题可能在于Windows上的
auto old_locale = std::locale::global(std::locale(""));
cout << old_locale.name() << "\n";
cout << std::locale("").name() << "\n";
输出不考虑系统语言环境,并且不识别OEM语言环境“.OCP”或任何当前语言环境名称。这种行为是在与应用程序链接的库中硬编码的,而不是在某些系统范围内
请注意,您可以尝试检查setlocale的返回值:
auto loc = setlocale(LC_ALL, "");
if (loc == NULL){
printf ("setlocale failed!\n");
}
else
printf ("setlocale %s!\n",loc );
在我的情况下,它又回来了。。。“English_United United States.1252”,而我为用户设置了一个美国地区,为俄罗斯用户地区设置了“Russian_Russia.1251”,这与更常见的“En-US”格式不匹配。Windows使用下划线
在与作为不同用户运行的某个数据库服务进行接口时,还需要解决另一个问题。现有数据库已经实现了定义特定数据库使用的语言环境的支持
所有库函数的更多输出不随区域设置的更改而更改
敦促多平台应用程序的开发人员使用适当的库包进行格式化的输入/输出,这将消除与平台和实现特定行为之间的矛盾。并且--如果您想尊重用户的语言环境,默认情况下您从C语言环境开始,您必须显式设置它。标准C/C++中的区域设置处理很糟糕。它很难使用,平台之间也不一致。我建议搜索可以做到这一点的库。你们问的问题也是“修复我的解决方案”,而不是“我有这个任务怎么做,我正在尝试这个”。在某种程度上,您的问题会受到影响。正如我所说:应用程序尊重环境的区域设置(因此它以系统用户选择的格式显示小数点、千位分隔符、日期等)。我不是在问如何做到这一点,这只是应用程序运行的上下文,以及strod需要非默认小数点的原因。我不是在问“修复我的解决方案”。我试图了解localeconv()->decimal_point、sprintf()和strod()是否都使用相同的小数点字符。如何读取数据?从文件
std::ifstream
,fscanf
或某些特定于Windows的API?来自用户(标准输入)?还是需要从某个字符串读取数据?你能展示一些代码吗?是否为C和C++设置全局区域设置?或者您不想更改应用程序的全局区域设置?系统使用的编码是什么?strod的手册页只告诉我们小数点取决于语言环境,仅此而已。我知道我用了很多词,但在写一些毫无帮助的一次性答案之前,你能至少读一下这个问题吗?man std::strod
不行。这应该是一个暗示;你试图给出C++问题的C答案。代码> <代码>是正确的C++标题。你能给出一个例子,甚至更好地推荐一个正确处理区域设置的“适当的库包”吗?@ H.Guijt,你可以看看ICU。如果您使用一些框架库,它们可能已经包含对ICU的支持,例如Qt或OSG。这是不正确的。它的开头是错误的:“setlocale
在Windows上…”。这是一个UNIX//Linux错误。Windows没有setlocale
功能。它确实有SetThreadLocale
,但这有很大不同。Windows上的每个C++库都需要决定如何处理该概念差异。注释说明使用了Visual Studio,因此我们应该检查它的文档。@mAlters是的,它有,它是一个宏,根据设置扩展到一系列函数,它链接到运行时。OP还谈到试图让它在遗留平台上工作,但它在那里的表现更不稳定。错误的概念是没有代码> StasLoaLe>代码,导致MINW\MIGW64已经翻滚了自己的版本,它不影响MS运行时。@ Swift FrayayPe:MSDN同时保存Windows(OS)和VisualStudio(Windows的C++编译器之一)的文档。您提供的链接以msvc-160
结尾-它明确依赖于编译器版本,而不是操作系统版本。
auto loc = setlocale(LC_ALL, "");
if (loc == NULL){
printf ("setlocale failed!\n");
}
else
printf ("setlocale %s!\n",loc );