如何显示特定于文化的原生数字而不是阿拉伯数字?

时间:2011-06-04 22:17:38

标签: c# localization formatting cultureinfo

我想将数值转换为字符串,显示特定于文化的数字。例如,阿富汗使用的Dari语言(文化名称“prs-AF”)使用Eastern-Arabic numerals而不是大多数西方文化中使用的Arabic numerals0,1,2,3,4,5,6,7,8,9)。

在检查Framework内置的CultureInfo类时,它会列出正确的原生数字(从LinqPad的输出中截取屏幕截图):

linqpad output

CultureInfo.CreateSpecificCulture("prs-AF").NumberFormat.NativeDigits

但是,当尝试将数字转换为字符串以在该文化中显示时,我没有得到原始数字:

linqpad output

var number = 123.5;
var culture = CultureInfo.CreateSpecificCulture("prs-AF");
Thread.CurrentThread.CurrentUICulture = culture;
Thread.CurrentThread.CurrentCulture = culture;
var text = number.ToString(culture);
Console.WriteLine(text);

有谁能告诉我如何显示原生数字?

3 个答案:

答案 0 :(得分:13)

当您显示包含数字的文本时,会发生数字替换。

如你所见,它不应该改变数字的字符串表示。

无论数字替换,数字123.5的格式为字符串123.5。但是,如果相应地设置了Thread.CurrentThread.CurrentCulture并且演示引擎支持数字替换,那么显示具有适当的字形。 (WPF支持它)

答案 1 :(得分:3)

我在Reflector中看了NativeDigits propety和底层字段,但在格式化时似乎没有被任何东西使用(虽然Reflector中的Used by分析不能保证为100 %满)。因此,这些值可能仅供参考或类似。

您可以使用IFormatProvider的字符串输出,并使用ToString(culture)数组中的相应值手动替换所有数字,从而使用您自己的NativeDigits实现。虽然我担心这不是你要找的答案..

答案 2 :(得分:1)

也许你需要的是这个:

var number = 123.5;
var culture = CultureInfo.CreateSpecificCulture("prs-AF");
var text = String.Format(culture, "{0}", number);
Console.WriteLine(text);