Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;小数点_C++ - Fatal编程技术网

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上的 StStalaLe>代码不符合标准中的建议,因为它是OS的IdioSoCurZiy上的一个库包装器,例如仅在WIN10中支持C++运行时的UTF-8。更多的是,SpReFTF\PrimTf\StRod的一些C++库实现仅尊重代码> STD::LoaLe::全局< /代码>。更重要的是,一些运行时只支持“C”和“”,并且仅支持ANSI或IEEE-754格式的输出(因此是一个点)。旧的Win10和旧版本甚至不尊重IEEE-754

例如,Windows-7上的任意MinGW64将响应此代码:

 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 );