为什么在 ValidationRule 的 Validate 函数中,decimal.TryParse(valueString, out valueParsed) 返回 true,给出 1.0.1?

问题描述 投票:0回答:1

这是我的代码:

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

c# wpf decimal
1个回答
0
投票

.
是世界一半人口(包括欧洲)的千位分隔符,因此
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);
}
© www.soinside.com 2019 - 2024. All rights reserved.