一个常见的国际问题是字符串中表示的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
和朋友合作,我可以使用
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 . ,
哪个国家/地区使用哪种设置?也许你可以给我添加一些我迄今为止没有的有趣例子。
答案 0 :(得分:2)
不要使用atof(s)。这是一个快速的&amp;没有错误报告的strtod(s,0)的脏快捷方式。 (对于atoi()和strtol()也是如此。)
如果发布函数以在遇到困难时返回错误代码,那么 是的,检查该代码,即使检查的代码大小增加了三倍 你的打字手指会产生疼痛,因为如果你瘦了,那就不会发生 我,众神肯定会因你的傲慢而惩罚你。
(亨利斯宾塞,“C程序员的十诫”,诫命#6)
答案 1 :(得分:-1)
我认为你正在寻找Appendix D of The C++ Programming Language。您可能感兴趣的是,在程序中一次可以使用多个语言环境。