2015-11-28 15 views
8

これはC#でどのように正しく解析できるのかわかりませんが、カンマが繰り返し可能な3つの値に区切られていない場合は失敗したいと思います。例:1,123.23が合格するはずですが、11,23.23が失敗するはずです。しかし実際の出力は、カンマの位置が10進数の前にどこにあるかにかかわらず、tryparseは常にtrueを返すようです。decimal.tryparseでC#千区切り文字

編集:これはバグであることが判明したため、正規表現での回答が受け入れられています。ありがとうございました。

string price = "1,1,2,3.23"; 
decimal outputValue = 0; 
var allowedStyles = (NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands); 


if (Decimal.TryParse(price, allowedStyles, CultureInfo.GetCultureInfo("EN-us"), out outputValue)) 
{ 
    Console.WriteLine("Pass"); 
} 
+1

あなたはおそらく数は、最初の正規表現との適切なフォーマットであるチェックする必要があります:あなたは番号が解析可能かどうかをチェックして、もしそうなら、それは許容できる形式になって確認することができますDecimal.TryParseでこれを行うには –

+0

@KenTucker私は考えているndsはこの目的のために3つの繰り返し値をチェックする必要がありました。これはバグですか、1,2,3.456と1,23,45を受け付ける通貨形式ですか?千単位のセパレータとして知られているからです。 – stackdisplay

+0

何千もの区切り文字と 'Parse'(または' Convert'などの)メソッドを含むバグがあります。入力形式が正しいことを100%確実にする唯一の方法は、手動でチェックすることです。 – varocarbas

答えて

3

失敗渡しますコンマが正しい場所にあること。このことができます場合、私は知らないが、ええ、私は試すべきだと思い

Regex.IsMatch("11,23.23", "^[+-]?[0-9]{1,3}(,[0-9]{3})*(.[0-9]*)?$"); 
+1

これは、 "1,1,2,3.23"が通過する理由と11,23.23が元の例 –

+0

@ g.pickardou TryParseが期待どおりに動作しなかったので、私は正規表現の解決策で私の答えを更新しました。 –

+1

OKです。 Btw、簡単な交換もそれを行います。私たちは近づいていると思う "今彼らは2つの問題がある"引用:-) –

4

私はいくつかの異なるコードを実行し、あなたがAllowThousandsを適用するとき、私は実現の代わりに唯一の制約は、「」、それは数の整数部分であるべきであるということです。

いくつかの結果:

  • "123、3.12" あなたは適用されませんNumberStyles.AllowThousandsを指摘したように=>
  • は "123、3.1,3" =>
3

を:だから私は、正規表現は、ここであなたを助けることができると思います。私の答えはちょっとストレートですが、懸念事項がフォーマットの場合、私はそれを.ToString( "format specified")で比較しました。あなたの "価格"の文字列と比較してください。ちょうど私の2セント。

string price = "1,1,2,3.23"; 
decimal priceParse = 0; 

if (decimal.TryParse(price, out priceParse)) 
{ 
    string shouldBeFormat = Convert.ToDecimal(priceParse).ToString("#,##0.00"); 

    if (price == shouldBeFormat) 
    { 
     // your good 
    } 
    else 
    { 
     // no good 
    } 
} 
2

あなたが発見したのは明らかにバグです。私は強くお勧めしますここでは、代わりに回避策を実装しないでください。 (そしてまたKISSを適用する)。

高水準のアルゴリズムでこのコード部分が膨大な時間をかけて実行されたり、他の方法でパフォーマンスが重大である場合を除き、ここでは簡単な回避策があります。

(文字列を想定千枚のセパレータとして「」(カンマ)を使用している(と、それはいくつかの文化かもしれないとして、彼らは小数点区切り文字ではありません)。):

price = price.Replace(",",""); // This will not change the value when comma is thousand separator. 
// Go forward to parsing 
2

次の2つの可能な形式を持っているので、私はとにかくそこにあると思ういけない、

string price = "1,123.23"; 
decimal outputValue = 0; 
var allowedStyles = (NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands); 
var cul = CultureInfo.GetCultureInfo("EN-us"); 

if (decimal.TryParse(price, allowedStyles, cul, out outputValue)) 
{ 
    if (outputValue.ToString("N", cul) == price || outputValue.ToString("G", cul) == price) 
    { 
     Console.WriteLine("Pass"); 
    } 
} 
+0

こんにちは、質問の真の目的は、異なる受け入れ可能なフォーマットを受け入れることではありませんでした。 numberstyles.allowthousandsが適用されている場合、1,1,23.23を入力に入れることはプログラムにパスします。それは私の意味ではFAILであるはずです。 – stackdisplay

関連する問題