【问题标题】:Doubles decimal separator WPF双倍小数分隔符 WPF
【发布时间】:2017-07-03 10:16:27
【问题描述】:

在 WPF 中使用 TextBox 我会遇到问题,如果我使用 ',' 而不是 '.'每次我尝试获取值时,TextBox 内的文本都会转换为相同的数字,不带逗号..

如何禁用此自动转换?

<TextBox 
    x:Name="XValue" 
    Text="{Binding XInitValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    Width="80" VerticalAlignment="Center" 
    TextChanged="XValue_TextChanged" 
</TextBox>

private void XValue_TextChanged(object sender, TextChangedEventArgs e)
{
    double a = XInitValue;
}

【问题讨论】:

标签: c# wpf format decimalformat


【解决方案1】:

我用转换器解决了这个问题

public class DecimalConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator == ".")
                return value.ToString().Replace(",", ".");
            else
                return value.ToString().Replace(".", ",");
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator == ".")
                return value.ToString().Replace(".", ",");
            else
                return value.ToString().Replace(",", ".");
        }

    }

【讨论】:

    【解决方案2】:

    真的好用!谢谢!

    我已将其更改为更通用,不要在转换器本身中使用 CurrentCulture,如果输入的值以小数分隔符结尾,则会返回错误。如果没有最后一部分,如果 UpdateSourceTrigger=PropertyChanged,我根本无法输入小数点分隔符。

    public class DecimalConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return value;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
            {
                return null;
            }
            if (value is string stringValue && targetType == typeof(decimal))
            {
                var decSeparator = culture.NumberFormat.NumberDecimalSeparator;
                var normString = decSeparator == "."
                    ? stringValue.Replace(",", ".")
                    : stringValue.Replace(".", ",");
                if (!normString.EndsWith(decSeparator) && decimal.TryParse(normString, out var decResult))
                {
                    return decResult;
                }
            }
            return DependencyProperty.UnsetValue;
        }
    }
    

    当然,CurrentCulture 应该在 App.xml.cs 或其他地方在启动应用程序时设置:

        var culture = CultureInfo.GetCultureInfo("de-DE");
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;
        FrameworkElement.LanguageProperty.OverrideMetadata(
            typeof(FrameworkElement),
            new FrameworkPropertyMetadata(
                XmlLanguage.GetLanguage(culture.IetfLanguageTag)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      相关资源
      最近更新 更多