使用InvariantCulture绑定十进制值

本文关键字:十进制 绑定 InvariantCulture 使用 | 更新日期: 2023-09-27 18:28:03

我有一个绑定到十进制属性的TextBox

我们的要求是具有InvariantCulture行为。

当用户键入6.30时,该值需要为6,30

如果用户键入6,30,则该值需要为6,30

当前,当使用点时,绑定会将值设置为630

这可能吗?

使用InvariantCulture绑定十进制值

您的需求实际上不是InvariantCulture的行为。您希望允许用户键入两种形式的数字,小数点为.,。这种动态表达式当然需要一些自定义转换器。试试这个自定义转换器:

public class MultiCultureNumberConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
                          System.Globalization.CultureInfo culture)
    {
        var ci = System.Globalization.CultureInfo.InvariantCulture.Clone() 
                 as System.Globalization.CultureInfo;
        ci.NumberFormat.NumberDecimalSeparator = ",";
        return ((decimal)value).ToString(ci);
    }
    public object ConvertBack(object value, Type targetType, object parameter, 
                              System.Globalization.CultureInfo culture)
    {
        var ci = System.Globalization.CultureInfo.InvariantCulture.Clone() as 
                 System.Globalization.CultureInfo;
        var s = System.Convert.ToString(value);
        decimal d;
        if (decimal.TryParse(s, System.Globalization.NumberStyles.Number 
                  ^ System.Globalization.NumberStyles.AllowThousands, ci, out d))
        {
            return d;
        }
        else
        {
            ci.NumberFormat.NumberDecimalSeparator = ",";
            if (decimal.TryParse(s, System.Globalization.NumberStyles.Number 
                ^ System.Globalization.NumberStyles.AllowThousands, ci, out d)) 
              return d;
        }
        return Binding.DoNothing;
    }
}