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

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

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

linqpad输出

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

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

linqpad输出

 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); 

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

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

正如您所见,它不应该更改数字的字符串表示forms。

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

我查看了NativeDigits propety和Reflector中的基础字段,它在格式化时似乎没有被任何东西使用(尽管在Reflector中Used by分析并不保证100%已满)。 因此,这些值可能只是供参考或类似的东西。

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

也许你需要的是这个:

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