gpt4 book ai didi

c++ - 双字符串转换和语言环境

转载 作者:可可西里 更新时间:2023-11-01 18:39:49 27 4
gpt4 key购买 nike

一个常见的国际问题是以字符串表示的 double 值的转换。这种东西在很多地方都有。

从 csv 文件开始

comma separated

character separated

因为有时候它们的存储方式是这样的

1.2,3.4
5.6,6.4

在英语地区或

1,2;3,4
5,6;6,4

例如在德国地区。

从这个背景来看,有必要知道大多数 std::方法都依赖于语言环境。所以在德国,他们会将“1,2”读作 1.2,然后将其写回“1,2”,但在英语操作系统中,他们会将“1,2”读作 1,并将其写回“1”。

因为语言环境是应用程序的全局状态,所以将它切换到不同的设置并不是一个好主意;当我必须在英语机器上读取德语 CSV 文件时,我们遇到了一些问题,反之亦然。

编写在所有机器上表现相同的代码也很困难。 C++ 流允许为每个流设置语言环境。

class Punctation : public numpunct<wchar_t>
{
public:

typedef wchar_t char_type;
typedef std::wstring string_type;

explicit Punctation(const wchar_t& decimalPoint, std::size_t r = 0) :
decimalPoint_(decimalPoint), numpunct<wchar_t>(r)
{
}

Punctation(const Punctation& rhs) :
decimalPoint_(rhs.decimalPoint_)
{
}

protected:

virtual ~Punctation()
{
};

virtual wchar_t do_decimal_point() const
{
return decimalPoint_;
}

private:

Punctation& operator=(const Punctation& rhs);

const wchar_t decimalPoint_;
};

...

std::locale newloc(std::locale::classic(), new Punctation(L','));
stream.imbue(newloc);

将允许您使用 std::C 行为初始化流并且仅替换小数点。这使我能够忽略千位分隔符,它也可能会受到影响。德语 1000.12 可能变成“1.000,12”;或英文中的“1,000.12”将完全困惑。甚至将“,”替换为“。”在这种情况下无济于事。

如果我必须和 atof 以及我可以使用的 friend 一起工作

const char decimal_point = *(localeconv()->decimal_point);

为我的行为拉皮条。

所以有大量关于国际双重行为的内容。甚至我的 Visual Studio 也遇到了问题,因为德语版本想要将 8,0 作为版本写入 vcproj 文件,而英语版本想要将其更改为 8.0,这肯定是偶然发生的,因为在 XML 中它被定义为 8.0世界各国。

所以我只是想稍微描述一下问题,以询问我可能忽略的方面。我知道的事情:

  • 十进制品脱取决于语言环境
  • 千位分隔符取决于语言环境
  • 指数取决于语言环境

//                  German       English     Also known
// decimal point , .
// exponent e/E e/E d/D
// thousand sep . ,

哪个国家/地区使用哪种设置?或许你可以给我添加一些有趣的例子,我现在还没有。

最佳答案

永远不要使用 atof( s )。这是 strtod( s, 0 ) 的快捷方式,没有错误报告。 (对于 atoi() 和 strtol() 也是一样。)

如果一个函数被宣传为在遇到困难时返回一个错误代码,你应该检查那个代码,是的,即使检查是你代码大小的三倍并在你打字的手指上产生疼痛,因为如果你认为它不会发生我’,众神一定会惩罚你的傲慢。

(Henry Spencer,“C 程序员的十诫”,第 6 条诫命)

关于c++ - 双字符串转换和语言环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1005663/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com