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

时间:2009-10-29 13:29:23

标签: c# wpf localization

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

这是一个包含double的示例类:

public class Class1
{
    private double someDouble = 0.874;

    public double SomeDouble
    {
        get { return someDouble; }
    }
}

我想将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>

我的测试值转换器,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();
    }
}

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

实施例: 输入“1234”作为TextBlock元素中的文本只会以英文形状显示。但是,如果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;

答案 1 :(得分:0)