WPF StringFormat=0:C 显示为美元

Posted

技术标签:

【中文标题】WPF StringFormat=0:C 显示为美元【英文标题】:WPF StringFormat=0:C showing as dollarsWPF StringFormat=0:C 显示为美元 【发布时间】:2011-02-15 09:59:04 【问题描述】:

为什么会出现这行代码

<TextBlock Text="Binding Net, StringFormat=c"/>

当我的所有区域设置都设置为英国时,将结果输出为 $xx.xx。我希望它以 £xx.xx 的形式输出。有任何想法吗?我尝试了不同的字符串格式变体,包括 StringFormat=0:C,但仍然得到相同的结果。

感谢收看。

【问题讨论】:

【参考方案1】:

我不确定 .NET 4 中是否已修复此问题,但 WPF 在呈现货币或日期等内容时从未采用当前文化。我认为这是一个巨大的疏忽,但幸运的是很容易纠正。

在您的 App 类中:

protected override void OnStartup(StartupEventArgs e)

    FrameworkElement.LanguageProperty.OverrideMetadata(
        typeof(FrameworkElement),
        new FrameworkPropertyMetadata(
            XmlLanguage.GetLanguage(
            CultureInfo.CurrentCulture.IetfLanguageTag)));
    base.OnStartup(e);
 

更多信息请参见this excellent post。

【讨论】:

完美,我花了一个小时试图找到解决方案,您在 5 分钟内解决了它,谢谢。 实际上,根据this bug report at MS Connect 的说法,这不是一个错误,而是一个 feature 正如 MS 所说... 很奇怪 feature,我会说,但很高兴知道这在未来的版本中不太可能“修复”。 虽然这不会选择对区域设置的自定义更改(即我使用的是德语,但使用的是健全的日期格式 [ISO 8601])。是否也有解决方法? 就我而言,我没有在“OnStartUp”事件中使用它。只需将它放在我的“故障窗口”加载之前就足够了。谢谢。 很好的提示。谢谢【参考方案2】:

我在主窗口中输入 Language="en-GB",例如

<Window x:Class="AllocateWPF.Vouchers"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test" Height="692" Width="1000" Language="en-GB">

【讨论】:

绝对是您在窗外制作原型时最快的方法! 救命稻草,我爱你。要显示欧元符号和点而不是逗号(意大利文化):XAML 中的 Language="it-IT",然后使用 "€ #,##0.00" 格式化字符串 如果您需要格式化 DataGridTextColumn,请使用:Binding="Binding Path=PrezzoListino, ConverterCulture='it-IT', StringFormat='\0:€ #,##0.00 \'" 在 DataGridTextColumn 中。示例是要绑定到意大利文化、欧元货币和“PrezzoListino”字段。【参考方案3】:

什么对我有用: 1) 在 app.xaml 中覆盖 OnStartup() 并添加 - System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("et-EE");

2) 在 XAML 中定义@Window level - xmlns:sysglb="clr-namespace:System.Globalization;assembly=mscorlib"

3) 在 XAML 中 - &lt;TextBox Text="Binding Path=Price, StringFormat='0:C', ConverterCulture=x:Static sysglb:CultureInfo.CurrentUICulture" /&gt;

正确选择任何自定义区域设置。尽管我在第一步中使用了手动创建的 CultureInfo,但我确信可以传入其中一种静态类型 - 例如。 System.Globalization.CultureInfo.CurrentCulture(虽然我还没有测试过......)

【讨论】:

这确实解决了自定义设置问题。对于第 1 步,我使用了“= new CultureInfo(CultureInfo.CurrentCulture.IetfLanguageTag)”而不是对其进行硬编码。 太好了,谢谢。微软真的应该解决这个问题。

以上是关于WPF StringFormat=0:C 显示为美元的主要内容,如果未能解决你的问题,请参考以下文章

WPF在XAML中Binding使用StringFormat属性

wpf: DataGridTextColumn 数字格式显示,编辑时取消格式(StringFormat)

WPF绑定StringFormat不会改变输出[重复]

使用 stringformat=0:d 时 WPF 应用程序自定义 shortdate

WPF 绑定 StringFormat 短日期字符串

WPF StringFormat 格式化文本