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

DevExpress WPF Grid列数字格式化:整数自动隐藏小数位

解决DevExpress WPF网格列动态小数位显示问题

我明白你的需求:整数要显示为纯数字(比如96),带小数的数值保留实际的有效小数位(比如120,65、23,12003),而不是固定两位小数。当前用DisplayFormatString="n"会强制保留两位小数,这就是问题所在,下面给你两种可行的解决方案:

方法一:使用自定义格式字符串(最简单)

直接修改DisplayFormatString为带可选小数位的格式,结合NumericMaskOptions.AlwaysShowDecimalSeparator="False"就能实现需求。把原来的DisplayFormatString="n"替换成#.##########(后面的#可以根据你可能的最大小数位数调整,比如写10个足够覆盖大部分场景)。

修改后的完整列代码:

<dxg:GridColumn Header="Počet/Objem" FieldName="Volume" BestFitModeOnSourceChange="AllRows" BestFitMode="AllRows" AllowBestFit="True">
    <dxg:GridColumn.CellTemplate>
        <DataTemplate>
            <dxe:TextEdit Name="PART_Editor" 
                          HorizontalContentAlignment="Right" MaskType="Numeric" 
                          DisplayFormatString="#.##########"
                          ShowBorder="False" 
                          dxe:NumericMaskOptions.AlwaysShowDecimalSeparator="False"/>
        </DataTemplate>
    </dxg:GridColumn.CellTemplate>
</dxg:GridColumn>

格式说明:

  • #:表示可选的数字位,如果该位置没有数字就会被省略
  • .:小数分隔符(会根据当前文化自动显示为逗号)
  • 小数点后的多个#:确保所有有效小数位都能显示,没有的话自动截断

方法二:使用值转换器(更灵活)

如果格式字符串无法满足特殊逻辑(比如需要对小数位数做更复杂的判断),可以自定义一个IValueConverter来处理数值显示:

1. 实现转换器类(C#)

using System;
using System.Globalization;
using System.Windows.Data;

public class DynamicNumericConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is decimal num)
        {
            // 判断是否为整数
            if (num == Math.Floor(num))
            {
                return num.ToString("N0", culture); // 显示为整数,无小数位
            }
            else
            {
                // 转换为字符串并去掉末尾的0和多余的分隔符
                string str = num.ToString(culture);
                str = str.TrimEnd('0');
                if (str.EndsWith(culture.NumberFormat.NumberDecimalSeparator))
                {
                    str = str.Substring(0, str.Length - culture.NumberFormat.NumberDecimalSeparator.Length);
                }
                return str;
            }
        }
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // 编辑模式下的反向转换,确保能转回数值类型
        if (decimal.TryParse(value.ToString(), NumberStyles.Any, culture, out decimal result))
        {
            return result;
        }
        return 0m;
    }
}

2. 在XAML中引用并使用转换器

首先在资源中声明转换器:

<Window.Resources>
    <local:DynamicNumericConverter x:Key="DynamicNumericConverter"/>
</Window.Resources>

然后修改列的CellTemplate,去掉MaskType和DisplayFormatString,改用绑定转换器:

<dxg:GridColumn Header="Počet/Objem" FieldName="Volume" BestFitModeOnSourceChange="AllRows" BestFitMode="AllRows" AllowBestFit="True">
    <dxg:GridColumn.CellTemplate>
        <DataTemplate>
            <dxe:TextEdit Name="PART_Editor" 
                          HorizontalContentAlignment="Right" 
                          ShowBorder="False" 
                          EditValue="{Binding Volume, Converter={StaticResource DynamicNumericConverter}}"/>
        </DataTemplate>
    </dxg:GridColumn.CellTemplate>
</dxg:GridColumn>

这种方法完全自定义显示逻辑,适合更复杂的场景。

总结

  • 如果只是简单的动态显示有效小数位,方法一足够简单高效,推荐优先使用
  • 如果需要特殊的显示规则(比如限制最大小数位数、自定义截断逻辑等),再考虑方法二

内容的提问来源于stack exchange,提问作者David Bašta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 17:10:49