1

App.xaml.cs には次のものがあります。

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

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

私の MainWindow.xaml.cs には次のものがあります。

NumberFormatInfo nfi = System.Threading.Thread.CurrentThread
                       .CurrentCulture.NumberFormat;
nfi.CurrencySymbol = "USD";
nfi.CurrencyDecimalSeparator = ".";
nfi.CurrencyDecimalDigits = 0;

NumberFormatInfo nfi = System.Threading.Thread.CurrentThread
                       .CurrentUICulture.NumberFormat;
nfi.CurrencySymbol = "USD";
nfi.CurrencyDecimalSeparator = ".";
nfi.CurrencyDecimalDigits = 0;

MainWindow から開く別のウィンドウで、次のように記述しました。

<TextBox Text="{Binding Total, StringFormat=c}"

しかし、結果は $1,200.00 のようなもので、私が予想していたものではありません: USD1,200. ここで何が問題なのですか?

4

2 に答える 2

1

よりスマートな方法があるかもしれませんが、これは一貫して機能するはずです...

// xmlns:sysglb="clr-namespace:System.Globalization;assembly=mscorlib"
<TextBox Text="{Binding Total, StringFormat='{}{0:C}', ConverterCulture={x:Static sysglb:CultureInfo.CurrentUICulture}}" />  

そして、これをアプリの起動時またはctorで移動します...

次にOverrideMetadata、前に実行しbase.OnStartupます-たとえば..

protected override void OnStartup(StartupEventArgs e)
{
    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB");

    NumberFormatInfo nfi = System.Threading.Thread.CurrentThread
                            .CurrentCulture.NumberFormat;
    nfi.CurrencySymbol = "USD";
    nfi.CurrencyDecimalSeparator = ".";
    nfi.CurrencyDecimalDigits = 0;

    nfi = System.Threading.Thread.CurrentThread
                            .CurrentUICulture.NumberFormat;
    nfi.CurrencySymbol = "USD";
    nfi.CurrencyDecimalSeparator = ".";
    nfi.CurrencyDecimalDigits = 0;

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

    base.OnStartup(e);

}

以下も参照してください。

WPF StringFormat={0:C} ドル表示

于 2013-04-11T12:17:11.990 に答える
0

NumberFormatting は、CurrentUICulture ではなく、CurrentCulture を使用する操作です (Culture または NumberFormatter をメソッドに明示的に指定しない限り、既定では)。CurrentUICulture は、リソース (ローカリゼーション) ルックアップに使用されます。

CurrentCulture から取得する NumberFormatInfo は読み取り専用にする必要があり(NumberFormatInfo ドキュメントの解説を参照)、いずれかのプロパティを設定しようとすると InvalidOperationException をスローする必要があります(NumberFormatinfo.IsReadOnly の解説を参照)。(この例外を飲み込んでいますか?) 書き込み可能な CultureInfo を作成し、そのプロパティを変更すると、それを現在のカルチャとして設定できます。

次のようなことをする必要があります:

CultureInfo ci = CultureInfo.CreateSpecificCulture("en-US");
NumberFormatInfo nfi= ci.NumberFormat;
nfi.CurrencySymbol = "USD";
nfi.CurrencyDecimalSeparator = ".";
nfi.CurrencyDecimalDigits = 0;
// set the default culture for all threads that haven't been explicitly set (.Net 4.5)
CultureInfo.DefaultThreadCurrentCulture = ci;
// or the following if you aren't using .Net 4.5
// Thread.CurrentThread.CurrentCulture = ci;
于 2013-04-11T19:45:21.850 に答える