web-dev-qa-db-ja.com

C#float.Parse文字列

私はC#が初めてなので、float(x, y, z)ファイルから。次のようになります。

0 -0.01 -0.002

0.000833333333333 -0.01 -0.002

Iamがしようとしている場合

float number = float.Parse("0,54"); // it works well, but
float number = float.Parse("0.54"); // gains exepction.

各行から値を読み取るための私のコード(バグがあります):

int begin = 0;
int end = 0;
for (int i = 0; i < tempLine.Length; i++)
{
    if (Char.IsWhiteSpace(tempLine.ElementAt(i)))
    {
        end = i;
        float value = float.Parse(tempLine.Substring(begin, end));
        begin = end;
        System.Console.WriteLine(value);
    }
}

誰かが助けることができますか?

13
Shelboy

float.Parse(string) method は、デフォルトで現在のカルチャ設定を使用します。 CurrentCultureNumberDecimalSeparatorプロパティ は_,_ではなく_._のように見えます

_"0.54"_の例でFormatExceptionを取得する理由です。

解決策として、NumberDecimalSeparatorメソッドの2番目のパラメーターとして InvariantCulture のようなParseとして_._を持つカルチャーを使用できますまたは、 .Clone() your CurrentCultureに設定し、NumberDecimalSeparatorプロパティを_._に設定します。

_float number = float.Parse("0.54", CultureInfo.InvariantCulture);
_

または

_var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.NumberFormat.NumberDecimalSeparator = ".";
float number = float.Parse("0.54", culture);
_
22
Soner Gönül

カルチャはcommaを小数点記号として使用しているようです。 InvariantCultureで解析してみてください

var value = float.Parse(tempLine.Substring(begin, end), CultureInfo.InvariantCulture);

これに加えて、行を解析する方法は必要以上に複雑です。インデックスを処理する代わりに、行を分割することができます。

foreach(var str in tempLine.Split())  
{
    float value = float.Parse(str, CultureInfo.InvariantCulture);
}
5
Selman Genç