我需要为我正在处理的应用程序显示阿拉伯数字字符的英文双。
这是一个包含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%”。
有没有人对一个简单的方法有任何建议?
答案 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)