一般的な国際的な問題は、ストリングで表されるダブル値の変換です。このことは多くの分野で見られます。時々彼らは英語の地域でダブルストリング変換とロケール
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 . ,
依存していますか?多分あなたは私が今まで持っていなかった興味深い例を私に追加することができます。
http://en.wikipedia.org/wiki/Decimal_point#Examples_of_use – Pod