如何使用区域性将绑定格式化为像这样 #####.##
本文关键字:像这样 ##### 格式化 绑定 何使用 区域性 | 更新日期: 2023-09-27 18:32:30
我的 ViewModel 上有一个双精度值,并且想要绑定 TextBlock 的文本,以便:
128228.094545 的格式设置为 128228[x]09,其中 [x] 是根据计算机的区域性设置的小数分隔符。
我试过:
Text="{Binding Value, StringFormat='{}{0:F2}'}"
不起作用:无论正确的小数分隔符符号如何,该值都会显示 128228.09。
Text="{Binding Value, StringFormat='{}{0:N2}'}"
呈现我不想要的数字分组符号([d],y在en-US中):128[d]228[x]09
Text="{Binding Value, StringFormat='{}{0:0.00}'}"
显然行不通。
什么是正确的格式字符串?
我认为
问题是当在数据绑定中使用 StringFormat 时,它不尊重当前区域性。
过去,我使用过一个简单的IValueConverter来格式化值。如果您的应用程序允许用户指定所有数字的格式选项(例如小数位数),这将非常有用。或者,您可以使用转换器参数指定格式字符串并简单地返回:
String.Format(CultureInfo.CurrentCulture, converterParameter, value)
如果不需要用前缀或后缀将值括起来,则以下转换器应允许您与格式化值进行转换:
public class StringFormatConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
var parameterString = parameter as string;
if (value != null && parameterString != null)
{
return String.Format(CultureInfo.CurrentCulture, "{0:"+ parameterString + "}", value);
}
else
{
return string.Empty;
}
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (targetType == typeof (double))
{
return System.Convert.ToDouble(value, CultureInfo.CurrentCulture);
}
else if (targetType == typeof(int))
{
return System.Convert.ToInt32(value, CultureInfo.CurrentCulture);
}
// Any other supported types
else
{
throw new NotImplementedException();
}
}
}
我认为你的第一个定义是正确的。问题是格式始终根据设置的区域性完成。不知道你到底在使用什么,但这取决于如何为应用设置区域性。
这是一篇很棒的博客文章,描述了 WPF 的它,因为手动定义区域性存在一些问题......
http://www.west-wind.com/weblog/posts/2009/Jun/14/WPF-Bindings-and-CurrentCulture-Formatting