2009-06-18 17 views
10

私はアプリケーションに情報を入力するために使用するテキストファイルを持っています。問題は、いくつかの値が浮動小数点であり、時にはnullであることです。例外を取得します。float.Parse()が私の望むように動作しません

 var s = "0.0"; 
     var f = float.Parse(s); 

上記のコードは、2行目の「入力文字列が正しい形式ではありません」という例外をスローします。

解決策は、IFormatProviderをパラメータとして含むfloat.Parseの高度なオーバーロードですが、まだそれについてはわかりません。

"0.0"を解析するにはどうすればよいですか?

+0

私はあなたのコードを試して、値を細かく解析することができます。 –

+3

このコードはカルチャに依存します(ロケールに依存)。だから私たちの何人かはこの行動を見ません。 – inazaruk

答えて

22

ドット記号 "。"です。セパレータとして使用されません(これはカルチャの設定に依存します)。あなたは、ドットが正しく解析されることが確実になりたいのであれば、あなたはこのような何かを記述する必要があります。

CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone(); 
ci.NumberFormat.CurrencyDecimalSeparator = "."; 
avarage = double.Parse("0.0",NumberStyles.Any,ci); 
+0

私は後悔して申し訳ありません(私は今あなたの答えを受け入れていました)、しかし私は忙しかったです。あなたの答えがありがとう、それは私が必要なことをします。私は本当に感謝します。 –

+2

CultureInfo.InvariantCultureが優れています。 (下記参照) –

2

私はこれを試したところ、例外は一切発生しませんでした。

数字の書式は、小数点ではなく小数点のカンマを使用していますか?あなたは試してみました:

var s = "0,0"; 
var f = float.Parse(s); 

は、私はちょうど例外を取得するために期待カンマでそれを試してみたこれを尋ねたが、なかったです。これは答えではないかもしれません。

+0

例外は、正しいロケール、たとえば英語で生成できます。 – Akku

+0

@Akku - 私は正確なテストを覚えていません(私はこの回答を2 1/2年前に投稿しました)が、ロケールとそれが数値の解析にどのように影響するかを認識しています。私は、彼の*ロケールが小数点ではなく小数点のカンマを必要とするものに設定されていることをユーザーに示唆していました。 – ChrisF

+0

この[新しい質問](http://stackoverflow.com/questions/8883801/double-tryparse-ignores-numberformatinfo-numbergroupsizes)は、例外ではなく結果が得られた理由を説明するかもしれません。 – ChrisF

2

または、入力テキストがnullでないか、空であるかどうかを簡単に確認できます。

また、一部の国では、 "。" (ドット)は "、"(コンマ)

+0

実際には、そのドットは動作しません。コンマに変更すると、うまくいきました。ファイル全体を変更する必要があるかもしれません。 –

+1

いいえ、そうではありません。カスタムセパレータとして認識されるようにドットを設定できます。 – inazaruk

+0

面白いですが、どうですか? –

6

あなたが最初にnullまたは空の文字列をチェックすることができます。

Parseのオーバーロードのいずれかを使用して(さらにはTryParseを使用して)、より具体的な制御を行うこともできます。

など。非ユーザ可視データと小数点変動を避けるために、invarient培養を使用して確認する(例えば、A2A通信から):私のため

float SafeParse(string input) { 
    if (String.IsNullOrEmpty(input)) { throw new ArgumentNullException("input"); } 

    float res; 
    if (Single.TryParse(input, NumberStyles.Float, CultureInfo.InvariantCulture, out res)) { 
    return res; 
    } 

    return 0.0f; // Or perhaps throw your own exception type 
} 
3

後作品:

string stringVal = "0.0"; 
float floatVal = float.Parse(stringVal , CultureInfo.InvariantCulture.NumberFormat); 

逆の場合は(のために働きますすべてのcoutries):

float floatVal = 0.0f; 
string stringVal = floatVal.ToString("F1", new CultureInfo("en-US").NumberFormat); 
関連する問題