我可以从具有不同数字分隔符的 istream 中读取双精度值吗?

Can I read double values from istream that have different digit separator?

我想在我的程序中从不同的文本文件中读取双精度值。有些文件包含 'xx.yyy' 格式的双精度数(点是分隔符),但其他一些文件 - 'xx,yyy'(逗号是分隔符)。我使用 C++ 流进行阅读。

如果您提前知道每个文件的格式,您可以 imbue() a std::ifstream with a custom std::locale whose std::numpunct facet specifies the desired thousands_sep and decimal_point characters. Then operator>> 将能够按预期解析 double 值。

有关如何指定自定义 decimal_point,请参阅 How can I set the decimal separator to be a comma?。同样的方法也适用于 thousands_sep

如果您提前不知道格式,则必须先将 double 作为字符串读取,然后手动解析它们以确定它们使用的格式,然后您可以 imbue() a std::istringstream 然后将字符串转换为 double。如果给定文件中的所有 double 使用相同的格式,那么您可以对第一个 double 执行此操作,然后根据需要对 imbue() std::ifstream 执行后续 doubles.