在 XAML 中,我想使用 StringFormat 来显示数值而不进行任何舍入。可能吗?

In XAML I want to use StringFormat to display a numerical value without any rounding happening. Is it possible?

所以在我的 XAML 我有这个:

<TextBlock Text="{Binding MyDecimalProperty, StringFormat={}{0:#.###}}"/>

例如,当 MyDecimalProperty 的值为 5.35570256 时,显示的 TextBlock 值为 5.356

有没有办法使用 StringFormat 让 TextBlock 显示 5.355(即截断数字而不是四舍五入)?

我知道我可以使用值转换器,但我想知道我是否可以使用 StringFormat 或 XAML 中定义的任何其他内容来实现相同的目的。

更新: 人们一直想知道为什么我不想使用转换器。请以粗体阅读以上内容。不是我不想;我只是想知道我是否可以对 StringFormat 或任何其他 XAML 结构做同样的事情。

谢谢。

我认为您不能仅使用 StringFormat 来完成此操作。您有不想使用转换器的原因吗? (见下文)。

转换器:

public class TruncateConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            double truncated;
            if (Double.TryParse(value, out truncated))
            {
                return ((double)((int)(truncated * 1000.0))) / 1000.0;
            }
        }
        return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return DependencyProperty.UnsetValue;
    }
}

用法:

<TextBlock Text="{Binding MyDecimalProperty, Converter={StaticResource TruncateConverter}}"/>

如果您不想使用转换器(我不确定为什么,但您会有自己的理由)您可以考虑更改绑定源的 returned 类型,然后实现 IFormattable 接口.

看看这个样本。首先,您的 MyDecimalProperty 不应再 return 小数。您应该将其更改为 return 和 TruncatedDecimal。这里是它的代码:

public class TruncatedDecimal : IFormattable
{
    private decimal value;

    public TruncatedDecimal(decimal doubleValue)
    {
        value = doubleValue;
    }

    public decimal Value
    {
        get
        {
            return value;
        }
    }

    public string ToString(string format, IFormatProvider formatProvider)
    {
        int decimalDigits = Int32.Parse(format.Substring(1));
        decimal mult = (decimal)Math.Pow(10, decimalDigits);
        decimal trucatedValue = Math.Truncate(value * mult) / mult;

        return trucatedValue.ToString(format, formatProvider);
    }
}

现在,在您的 XAML 中,您可以使用您需要的格式字符串:

<TextBlock Text="{Binding StringFormat={}N5}" Margin="5" FontSize="20" />

因此,例如,如果以这种方式设置 DataContext:

DataContext = new TruncatedDecimal(new Decimal(.4997888869));

您将看到 0.49978。希望这个解决方案适合您的需求,对您有所帮助。

if I can use StringFormat or anything else defined in the XAML to achieve the same

StringFormat 特定于 Binding Markup Extension (actually the binding base BindingBase.StringFormat Property (System.Windows.Data)) and ultimately uses the .Net string formatting such as ToString("G3") (see Standard Numeric Format Strings),它四舍五入而不截断;因此无法覆盖 Xaml 此类功能。


在 viewmodel 上创建另一个 属性,它是一个关联的 string 类型,它简单地模仿所需的值,但被截断了。然后这样绑定。

ViewModel

public decimal TargetDecimal
{
    get { return _TargetDecimal; }
    set { _TargetDecimal = value; 
        OnPropertyChanged("TargetDecimal"); 
        OnPropertyChanged("TargetValueTruncated"); }
}

// No error checking done for example
public string TargetValueTruncated
{
  get { return Regex.Match(_TargetDecimal.ToString(), @"\d+\.\d\d\d").Value; }
}

Xaml

<TextBlock Text="{Binding TargetDecimal, StringFormat=Original:   {0}}"/>
<TextBlock Text="{Binding TargetDecimal, StringFormat=Modified:   {0:#.###}}"/>
<TextBlock Text="{Binding TargetValueTruncated, StringFormat=Truncated: {0}}"/> 

结果