WPF StringFormat={0:C} showing as dollars WPF StringFormat={0:C} showing as dollars wpf wpf

WPF StringFormat={0:C} showing as dollars


I'm not sure if this has been fixed in .NET 4, but WPF has never picked up the current culture when rendering things like currency or dates. It's something I consider a massive oversight, but thankfully is easily corrected.

In your App class:

protected override void OnStartup(StartupEventArgs e){    FrameworkElement.LanguageProperty.OverrideMetadata(        typeof(FrameworkElement),        new FrameworkPropertyMetadata(            XmlLanguage.GetLanguage(            CultureInfo.CurrentCulture.IetfLanguageTag)));    base.OnStartup(e); }

See this excellent post for more information.


I do Language="en-GB" in the main window e.g.

<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">


What works for me:
1) In app.xaml override OnStartup() and add - System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("et-EE");

2) Define in XAML @ Window level - xmlns:sysglb="clr-namespace:System.Globalization;assembly=mscorlib"

3) In XAML - <TextBox Text="{Binding Path=Price, StringFormat='{}{0:C}', ConverterCulture={x:Static sysglb:CultureInfo.CurrentUICulture}}" />

This correctly picks up any custom regional settings. Although I'm using a manually created CultureInfo in the first step, I'm sure it's possible to pass in one of the static types - eg. System.Globalization.CultureInfo.CurrentCulture (I haven't tested it though...)