双字符串转换和语言环境

Tot*_*nga 7 c++ locale decimal decimal-point

一个常见的国际问题是字符串中表示的双值的转换.这个东西在很多地方都有发现.

从调用的csv文件开始

comma separated
Run Code Online (Sandbox Code Playgroud)

要么

character separated
Run Code Online (Sandbox Code Playgroud)

因为有时它们会被存储起来

1.2,3.4
5.6,6.4
Run Code Online (Sandbox Code Playgroud)

在英语地区或

1,2;3,4
5,6;6,4
Run Code Online (Sandbox Code Playgroud)

例如德国地区.

从这个背景来看,有必要知道大多数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);
Run Code Online (Sandbox Code Playgroud)

将允许您使用std :: C行为初始化流,并仅替换小数点.这使我能够忽略千位分隔符,这也可能会产生影响.德语1000.12可能变为"1.000,12"; 或者用英文"1,000.12"将完全混淆.甚至用"."代替",".在这种情况下无济于事.

如果我必须atof与朋友一起工作,我可以使用

const char decimal_point = *(localeconv()->decimal_point);
Run Code Online (Sandbox Code Playgroud)

皮条客我的行为.

因此,国际双重行为有很多东西.甚至我的Visual Studio也遇到了问题,因为德语版本想要将8,0作为版本写入vcproj文件,而英文版本想要将其更改为8.0,这最终发生在事件中,因为在XML中它被定义为8.0世界各国.

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

  • decimal pint依赖于locale
  • 千位分隔符取决于区域设置
  • 指数取决于语言环境

//                  German       English     Also known
// decimal point       ,            .            
// exponent            e/E          e/E          d/D
// thousand sep        .            ,
Run Code Online (Sandbox Code Playgroud)

哪个国家使用哪种设置?也许你可以加我一些有趣的例子,直到现在我还没有.

Max*_*ert -1

我认为您正在寻找《C++ 编程语言》的附录 D。您可能感兴趣的是,程序中可以同时使用多个区域设置。