7

国際的によくある問題は、文字列で表された 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」と書き戻しますが、英語の OS では、「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 に変更しようとしているからです。世界の国。

そのため、私が無視した可能性のある側面を尋ねるために、問題を少し説明したかっただけです。私が知っていること:

  • 小数点はロケールに依存します
  • 桁区切り記号はロケールに依存します
  • 指数はロケールに依存します

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

どの国がどの設定を使用していますか? たぶん、私が今まで持っていなかった興味深い例をいくつか追加してください.

4

2 に答える 2

2

atof( s ) は絶対に使用しないでください。これは、エラー報告のない strtod( s, 0 ) の簡単で汚いショートカットです。(atoi() や strtol() も同様です。)

関数が問題が発生した場合にエラー コードを返すように宣伝されている場合は、そのコードをチェックする必要があります。神々はきっとあなたの傲慢さのためにあなたを罰するでしょう.

(ヘンリー・スペンサー、「C プログラマーのための十戒」、戒め #6)

于 2009-06-17T08:39:55.470 に答える
-1

The C++ Programming Language のAppendix D を探していると思います。プログラムで一度に複数のロケールを使用できることに興味があるかもしれません。

于 2009-06-17T08:32:10.760 に答える