这是我的代码:
using System.Windows.Controls;
namespace MyTest.validations
{
public class DecimalValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
decimal valueParsed;
string? valueString = value.ToString();
if (decimal.TryParse(valueString, out valueParsed))
{
return new ValidationResult(true, null);
}
return new ValidationResult(false, "Inserisci un valore Decimale corretto");
}
}
}
如果对象的
value
(由 WPF's TextBox
填充)其 1.0.1
(使用调试器检查),则函数 TryParse
返回 true(不是小数)。
为什么?如何正确检查该值是否为
decimal
?
.
是世界一半人口(包括欧洲)的千位分隔符,因此 1.0.1
被解析为 101
。在美国相当于 1,0,1
。当您调用 TryParse(valueString, out valueParsed)
时,将使用当前用户的文化来解析字符串。
也许不受文化影响的最安全方法是防止使用千位分隔符。您可以通过 NumberStyles 参数控制数字字符串中允许的内容。默认值为
Number
,它允许千位分隔符和小数分隔符。您可以使用仅允许小数点分隔符的 Float
来代替:
if( decimal.TryParse("1.0.1",NumberStyles.Number, CultureInfo.GetCultureInfo("it-IT"),out var d))
{
Console.WriteLine(d);
}
传递
null
而不是特定的 CultureInfo 使用当前区域性:
if( decimal.TryParse("1.0.1",NumberStyles.Number, null,out var d))
{
Console.WriteLine(d);
}