You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Entry控件小数点丢失问题:如何按区域文化适配DecimalConverter?

解决DecimalConverter无法保留小数及区域文化适配问题

问题根源

  1. Convert方法中直接调用decimal.ToString()未指定区域文化,可能导致小数格式与当前系统区域不匹配;
  2. ConvertBack方法未使用传入的CultureInfo参数解析字符串,当输入包含区域专属小数分隔符的内容时,可能解析失败返回0;
  3. Entry绑定默认在失去焦点时更新数据源,输入小数点的过程中易触发回写整数的情况。

修改后的转换器代码

public class DecimalConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is decimal decimalValue)
        {
            // 使用传入的区域文化格式化小数,确保显示正确的分隔符
            return decimalValue.ToString(culture);
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var inputStr = value as string;
        if (string.IsNullOrWhiteSpace(inputStr))
            return 0m;

        // 处理输入仅含小数点的情况(如"55."),补0后再解析
        if (inputStr.EndsWith(culture.NumberFormat.NumberDecimalSeparator))
        {
            inputStr += "0";
        }

        if (decimal.TryParse(inputStr, NumberStyles.Number, culture, out decimal dec))
        {
            return dec;
        }
        return 0m;
    }
}

Entry绑定调整

需要将绑定的UpdateSourceTrigger设置为PropertyChanged,确保输入内容实时触发转换,避免输入过程中被回写为整数:

<Entry
    BackgroundColor="{TemplateBinding BackgroundColorAmountEntry}"
    IsEnabled="{TemplateBinding IsByAmount}" 
    Keyboard="Numeric"
    Text="{TemplateBinding CommissionWithTaxAmount,
           Converter={StaticResource DecimalConverter},
           UpdateSourceTrigger=PropertyChanged}" />

关键修改说明

  • Convert方法:明确使用传入的culture参数格式化小数,保证显示的分隔符与当前区域一致;
  • ConvertBack方法:
    • 处理输入末尾仅为小数点的特殊场景,避免解析失败返回0;
    • 调用decimal.TryParse时指定culture和NumberStyles.Number,确保正确解析区域化的小数字符串;
  • Entry绑定:设置UpdateSourceTrigger=PropertyChanged,让输入的每一个字符都触发转换,避免输入小数点后被立即回写为整数。

内容的提问来源于stack exchange,提问作者SarPa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:00:20