双倍小数分隔符 WPF

Posted

技术标签:

【中文标题】双倍小数分隔符 WPF【英文标题】:Doubles decimal separator 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;

【问题讨论】:

请看这个答案:***.com/questions/9160059/… 【参考方案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)));

【讨论】:

以上是关于双倍小数分隔符 WPF的主要内容,如果未能解决你的问题,请参考以下文章

如何为多个文本框使用一个绑定来分隔 WPF XAML 中的三位数字?

NSNumberFormatter 适用于小数分隔符但不适用于逗号分隔符

Qt 小数分隔符

Dygraphs,逗号作为小数分隔符

货币小数分隔符不起作用

Angularjs小数分隔符逗号