C#TryParse()
の機能をもう少し厳しくする方法はありますか?decimal.TryParseはひどくフォーマットされた数字の文字列を受け入れています
あなたは数字、正しい小数点&桁区切り文字を含む文字列を渡す場合は今、多くの場合、ちょうど例えば、フォーマットは意味がない場合でも、それらを受け入れるようだ:123''345'678
私はTryParse
が正しいフォーマットになっていない場合、が成功しないようにする方法を探しています。
だから、私はチューリッヒに基づいており、私はこれを行う場合だ:
decimal exampleNumber = 1234567.89m;
Trace.WriteLine(string.Format("Value {0} gets formatted as: \"{1:N}\"", exampleNumber, exampleNumber));
...その後、私の地域設定で、私はこれを取得...
Value 1234567.89 gets formatted as: "1'234'567.89"
ので、私の地域では、小数点以下の文字は完全停止し、1000個の区切り文字はアポストロフィであることがわかります。
それでは、string
がdecimal
に解析することが可能かどうかをテストするための簡単な関数を作成してみましょう:
private void ParseTest(string str)
{
decimal val = 0;
if (decimal.TryParse(str, out val))
Trace.WriteLine(string.Format("Parsed \"{0}\" as {1}", str, val));
else
Trace.WriteLine(string.Format("Couldn't parse: \"{0}\"", str));
}
さて、いくつかの文字列で、この関数を呼び出してみましょう。
のどの文字列のうち、がこの関数で正常に解析されると思いますか?私はあなたが私のポイントを見ることができると思い
ParseTest("123345.67"); // 1. Parsed "123345.67" as 123345.67
ParseTest("123'345.67"); // 2. Parsed "123'345.67" as 123345.67
ParseTest("123'345'6.78"); // 3. Parsed "123'345'6.78" as 1233456.78
ParseTest("1''23'345'678"); // 4. Parsed "1''23'345'678" as 123345678
ParseTest("'1''23'345'678"); // 5. Couldn't parse: "'1''23'345'678"
ParseTest("123''345'678"); // 6. Parsed "123''345'678" as 123345678
ParseTest("123'4'5'6.7.89"); // 7. Couldn't parse: "123'4'5'6.7.89"
ParseTest("'12'3'45'678"); // 8. Couldn't parse: "'12'3'45'678"
:
以下は私が得た結果です。
私にとって、最初の2つの文字列だけが正常に解析されているはずです。他の人は、1000個の区切り文字の後に3桁の数字がないか、または2つのアポストロフィを一緒に使用しているので、すべて失敗しているはずです。
ParseTest
を少し具体的に変更しても、結果はまったく同じです。 (例えば、それは喜んで「123''345'678
」は有効な小数で受け付けます。)
private void ParseTest(string str)
{
decimal val = 0;
var styles = (NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands);
if (decimal.TryParse(str, styles, CultureInfo.CurrentCulture, out val))
Trace.WriteLine(string.Format("Parsed \"{0}\" as {1}", str, val));
else
Trace.WriteLine(string.Format("Couldn't parse: \"{0}\"", str));
}
をので、不正な形式の文字列がTryParse
に受け入れられることはできませへの簡単な方法がありますか?
更新提案のすべてのための
感謝。
おそらく私は明らかにする必要があります:私が探しているものは、これらの文字列の最初の2つは有効ですが、3番目は拒否されます。
ParseTest("123345.67");
ParseTest("123'456.67");
ParseTest("12'345'6.7");
は、確かにそれは、必要に応じて千区切りを許可するが、数の書式がメイクセンスを行い確認することができますので、「NumberStyles.AllowThousands
」を使用する方法が必要?私が使用している場合
は今のところ、この:
Parsed "123345.67" as 123345.67
Parsed "123'456.67" as 123456.67
Parsed "12'345'6.7" as 123456.7
そして、私が使用している場合は、この:
if (decimal.TryParse(str, styles, CultureInfo.InvariantCulture, out val))
私はこれらの結果を得る:
if (decimal.TryParse(str, styles, CultureInfo.CurrentCulture, out val))
は、私はこれらの結果を得る
Parsed "123345.67" as 123345.67
Couldn't parse: "123'456.67"
Couldn't parse: "12'345'6.7"
これは私の問題です... CultureInfoの設定に関係なく、その3番目の文字列は拒否され、最初の2つは受け入れられます。
*有効な*桁区切り記号を受け入れる必要がありますか?そうでない場合は、AllowThousandsを使用しないでください... –
別の正規表現検証が必要なようです。 –
正直なところ、隣り合っていることに驚いています。セパレータは '123''3445'678'の例では適切なプロパティを割り当てても正常に解析されます。しかし、この場合は 'NumberGroupSizes'プロパティを' {3、3、0} 'にするだけでよいでしょう。知りません。 –