【问题标题】:Binding a decimal value with InvariantCulture使用 InvariantCulture 绑定十进制值
【发布时间】:2014-10-28 12:26:05
【问题描述】:

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

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

当用户输入6.30时,值必须是6,30

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

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

这可能吗?

【问题讨论】:

  • 我在这些东西上遇到了很多问题,我主要是自己做所有的检查,最简单的方法是为文本框上的 textchanged 订阅一个事件并执行此操作 textbox1 .Text = textbox1.Text.Replace('.',','); .
  • @Vajura - 如果有人分别输入123,456.78123.456,78(在不同文化中都表示123456.78)怎么办?
  • @Vajura 这对我来说是不可能的,因为我使用 WPF 绑定。它的工作方式与 winforms 方式完全不同。

标签: c# wpf binding decimal culture


【解决方案1】:

你的要求其实不是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;
    }
}

【讨论】:

  • 有了那个 (NumberFormatInfo.InvariantInfo) 我希望它可以为6.30 正常工作(如:如预期),但现在6,30 不会变成630 吗?看起来 OP 正在寻找一种方法来使用两个不同的小数分隔符,据我所知,这并不容易。
  • 我收到 The name "CultureInfo" does not exist in the namespace "clr-namespace:System.Globalization;assembly=System.Globalization" 错误
  • @Corak 你说得对,我只是太专注于他将文化设置为InvariantCulture 的要求,而在这种文化中它应该始终将. 显示为.。跨度>
  • @DeMama 不知道怎么会出现这样的错误,我先尝试了我这边的代码。无论如何,这确实设置了文化,但对您的要求没有帮助(始终将 . 显示为 ,)。
  • 非常好@KingKing!谢谢
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多