C# WPF 将英文数字转换为阿拉伯数字

Jas*_*son 2 c# wpf localization

我需要为我正在处理的应用程序以阿拉伯数字字符显示英文双精度数。

这是一个包含双精度值的示例类:

public class Class1
{
    private double someDouble = 0.874;

    public double SomeDouble
    {
        get { return someDouble; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想在运行时将 SomeDouble 的值转换为以阿拉伯数字字符显示的百分比。这是我一直用作测试的一些快速 XAML:

<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:ArabicNumbers"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="ArabicNumbers.Window1"
Title="Window1"
Height="300"
Width="300">
<Window.Resources>
    <local:Class1 x:Key="Class1Instance" />
    <local:DoubleValueConverter x:Key="doubleValueConverter" />
</Window.Resources>

<Grid DataContext="{Binding Source={StaticResource Class1Instance}}">
    <TextBlock
        HorizontalAlignment="Left"
        VerticalAlignment="Top"
        TextWrapping="Wrap"
        Margin="10"
        Text="{Binding SomeDouble, Converter={StaticResource doubleValueConverter}, Mode=Default}"/>       
</Grid>
Run Code Online (Sandbox Code Playgroud)

还有我的测试值转换器 DoubleValueConverter:

public class DoubleValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        double valueAsDouble = (double)value;
        return valueAsDouble.ToString("P1", culture);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

在窗口后面的代码中,我将 Language 属性设置为“ar-SA”的当前区域性。这似乎是一项要求,因为这会更改 DoubleValueConverter 中文化参数的值。

public partial class Window1 : Window
{
    public Window1()
    {
        Language = XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.Name);
        InitializeComponent();
    }
}
Run Code Online (Sandbox Code Playgroud)

此转换器提供正确的格式属性,即小数点分隔符,但是我需要将这些数字输出为阿拉伯字符而不是“87,4%”。

有没有人对一个简单的方法有任何建议?

Jas*_*son 5

我找到了一个非常快速和简单的解决方案。我发现对数字使用阿拉伯字符是有上下文的;即数字形状取决于同一输出中的前一个文本。

示例:在 TextBlock 元素中输入“1234”作为文本将简单地以英文形状显示。但是,如果 1234 前面有一些阿拉伯语文本(比如“abcde”),例如 ??????1234。在这个例子中,前四位数字将是字符“1234”的阿拉伯形状。(注意:这似乎不适用于本网站 - 在文本框中正确显示,但预览显示数字的英文形状)

有关更多信息,请参阅这些链接:

http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.digitsubstitution.aspx http://msdn.microsoft.com/en-us/library/system.globalization.digitshapes.aspx

通过查看第二个链接,我想要的明显选择是 NativeNational,但是由于我们的 CurrentCulture 是由操作系统自动设置的,因此 CurrentCulture 实例是只读的。

为了绕过这个,我简单地创建了一个新的 CultureInfo 对象并将 DigitSubstitution 更改为 DigitShapes.NativeNational:

        CultureInfo ci = CultureInfo.CreateSpecificCulture(Thread.CurrentThread.CurrentCulture.Name);
        ci.NumberFormat.DigitSubstitution = DigitShapes.NativeNational;
        Thread.CurrentThread.CurrentCulture = ci;
Run Code Online (Sandbox Code Playgroud)