2012-01-16 23 views
7

私は何かが欠けているかどうかを知りたいです...私は標準的な英国の文化の下で走っています。Double.TryParse()はNumberFormatInfo.NumberGroupSizesを無視しますか?

Double result = 0; 
if (Double.TryParse("1,2,3", NumberStyles.Any, CultureInfo.CurrentCulture, out result)) 
{ 
    Console.WriteLine(result); 
} 

の予想される出力は何もないだろう... "1,2,3" はdoubleとして解析するべきではありません。しかしそれはそうです。 .NET 2.0 MSDN documentation

AllowThousandsによると、数字列がグループ 区切りを持つことができることを示します。たとえば、数千から数千を分離することができます。 有効なグループ区切り文字は、 NumberGroupSeparatorプロパティとCurrencyGroupSeparatorプロパティが NumberFormatInfoであり、各グループの桁数が で、NumberGroupSizesプロパティおよびCurrencyGroupSizesプロパティが NumberFormatInfoであると決定されます。

は数千人がNumberStyles.Anyに含まれている許可します。 NumberGroupSizesは私の文化にとって3です。 Double.Parseのバグですか?それはちょうど、入力文字列がNumberFormatInfo.NumberGroupSeparatorのゼロ以上のインスタンスを含めることができることを意味

+0

[私の答え](http://stackoverflow.com/questions/1014535/float-parse-doesnt-work-theをテストするとき、私は有効な結果を得た理由はあるかもしれません-way-i-wanted/1014559#1014559)にも同様の質問があります。 – ChrisF

+0

ちょうど興味がありますが、結果の価値は何ですか? – Aaron

+0

私はMicrosoftにバグがあるかどうか尋ねなければならないと思いますが、私はあなたと同じ動作をします。 'NumberStyles.Any^NumberStyles.AllowThousands'をいつでも行うことができますが、3つの正当なグループが存在することを期待している場合はあまり役に立ちません。 – Jodrell

答えて

5

....そうにないが、私は私が間違ってやって見つけることができません。このセパレータは、任意のサイズの数字のグループを区切るために使用できます。数千人だけではありません。小数を文字列として書式設定する場合は、NumberFormatInfo.NumberGroupSeparatorNumberFormatInfo.NumberGroupSizesが使用されます。リフレクターを使用すると、NumberGroupSeparatorは、文字が区切り文字かどうかを判断するためにのみ使用され、そうであれば、それはスキップされます。 NumberGroupSizesはまったく使用されていません。あなたは、文字列を検証したい場合は

、あなたは正規表現を使用して、そうか、そうするための方法を記述することができます。ここで私はちょうど一緒にハッキング一つだ:

string number = "102,000,000.80"; 
var parts = number.Split(','); 
for (int i = 0; i < parts.Length; i++) 
{ 
    var len = parts[i].Length; 
    if ((len != 3) && (i == parts.Length - 1) && (parts[i].IndexOf('.') != 3)) 
    { 
     Console.WriteLine("error"); 
    } 
    else 
    { 
     Console.WriteLine(parts[i]); 
    } 
} 

// Respecting Culture 
static Boolean CheckThousands(String value) 
{ 
    String[] parts = value.Split(new string[] { CultureInfo.CurrentCulture.NumberFormat.NumberGroupSeparator }, StringSplitOptions.None); 
    foreach (String part in parts) 
    { 
     int length = part.Length; 
     if (CultureInfo.CurrentCulture.NumberFormat.NumberGroupSizes.Contains(length) == false) 
     { 
      return false; 
     } 
    } 

    return true; 
} 
+0

+1、 'NumberGroupSizes'は解析時に無視されます(内部メソッドは' Number.ParseNumber'です)。 – user7116

+0

私はちょうどリフレクターで掘り出し始めましたが、まだそれを遠くまで落とす時間はありませんでした。私はRegexを実際に使うことを検討していますが、注意する必要があります。 – Ian

+0

@Ian各文化のNumberFormatInfoに格納されている情報に基づいてRegex式を構築できます。 –

関連する問題