双字符串转换和语言环境

时间:2009-06-17 07:53:14

标签: c++ decimal locale decimal-point

一个常见的国际问题是字符串中表示的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世界各国。

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

  • decimal pint依赖于语言环境
  • 千位分隔符依赖于语言环境
  • exponent是依赖于语言环境的

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

哪个国家/地区使用哪种设置?也许你可以给我添加一些我迄今为止没有的有趣例子。

2 个答案:

答案 0 :(得分:2)

不要使用atof(s)。这是一个快速的&amp;没有错误报告的strtod(s,0)的脏快捷方式。 (对于atoi()和strtol()也是如此。)

如果发布函数以在遇到困难时返回错误代码,那么 是的,检查该代码,即使检查的代码大小增加了三倍 你的打字手指会产生疼痛,因为如果你瘦了,那就不会发生 我,众神肯定会因你的傲慢而惩罚你。

(亨利斯宾塞,“C程序员的十诫”,诫命#6)

答案 1 :(得分:-1)

我认为你正在寻找Appendix D of The C++ Programming Language。您可能感兴趣的是,在程序中一次可以使用多个语言环境。