2009-06-17 14 views
7

一般的な国際的な問題は、ストリングで表されるダブル値の変換です。このことは多くの分野で見られます。時々彼らは英語の地域でダブルストリング変換とロケール

1.2,3.4 
5.6,6.4 

または

のように格納されているため、どちらか

comma separated 

または

character separated 

と呼ばれているCSVファイルを皮切り

たとえばドイツ地域では、

です。

このような背景から、ほとんどの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のセパレータを無視する能力を与え、それも影響を与えるかもしれません。 ドイツ語1000.12が「1.000,12」になることがあります。または英語で "1,000.12"は完全に混乱するでしょう。 "、"を "、"で置き換えることもできます。この状況では助けにならないでしょう。私はatofや友人と仕事をしなければならない場合

私は自分の行動をポン引きする

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

を使用することができます。

だから、国際的な二重の行動のためにちょっとしたものがある。私のVisual Studioでさえ問題に遭遇します。なぜならドイツ語版はvcprojファイルにバージョン8,0を書いているのに対し、英語版では8.0に変更したいのです。これは事件ではっきりと起こります。なぜなら、XMLでは8.0世界の国々。

私は無視したかもしれない側面を尋ねるために問題を少し説明したかっただけです。私が知っている 物事:

  • 小数点パイントロケールに依存
  • 000セパレータは、ロケールに依存
  • 指数ですロケールどの設定を使用していますどの国

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

依存していますか?多分あなたは私が今まで持っていなかった興味深い例を私に追加することができます。

+0

http://en.wikipedia.org/wiki/Decimal_point#Examples_of_use – Pod

答えて

-1

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

+0

なぜdownvote? –

2

atof(s)を使用しないでください。エラー報告なしで、strtod(s、0)のための素早い&ショートカットです。関数が困難の場合にエラーコードを返すようにアドバタイズされる場合

、そのコードのためのあなたは なかれチェック、いや、でもチェックしかし三重サイズ(ATOI()とstrtolは()も同様)あなたのコードの の痛みを引き起こします。あなたが「それは起こることはありません」と思えば、神はあなたの傲慢さのために必ずあなたを罰するでしょう。

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

関連する問題