为什么N'ko使用3位小数来显示定点("F")数字,而字面上每个其他文化使用2?

Qub*_*bei 9 c# localization internationalization number-formatting

不同的文化采用不同的小数点分隔符:一个点(1.23)或逗号(1,23)或-波斯(伊朗)的情况下,-a momayyez或斜线可能会发现(1月23日.或1/23).我一直在测试我的库,它涉及大量的数字解析(TimeSpanParser),所以一直在测试.NET处理各种数字格式.

当使用"F"十进制格式或数字("N")格式输出时,除N'Ko("nqo"或"nqo-GN")外,所有文化都显示2个小数位.为什么会这样?

下面的代码示例说明了这一点,但可能没有必要理解或遵循下面的代码来回答这个问题.


简述:

Console.WriteLine((1.23456).ToString("F", new CultureInfo("en-US"))); // 1.23 (2 dp in every culture other than "nqo" and "nqo-GN")
Console.WriteLine((1.23456).ToString("F", new CultureInfo("nqo"))); // 1.235
Run Code Online (Sandbox Code Playgroud)

更详细地说:

double number = 1.2345678;

Console.WriteLine($"Testing {number.GetType().FullName}");
Console.WriteLine($"value: {number}");
foreach (var culture in new string[] { "", "en-US", "fr-FR", "fa-IR", "nqo", "nqo-GN" } ) {
    var cultureinfo = new System.Globalization.CultureInfo(culture);
    string fformat = number.ToString("F", cultureinfo);
    Console.WriteLine($"{fformat} -- {cultureinfo.EnglishName} -- \"{cultureinfo.Name}\"");
}
Run Code Online (Sandbox Code Playgroud)

输出:

Testing System.Double
value: 1.2345678
1.23 -- Invariant Language (Invariant Country) -- ""
1.23 -- English (United States) -- "en-US"
1,23 -- French (France) -- "fr-FR"
1/23 -- Persian (Iran) -- "fa-IR"
1.235 -- N'ko -- "nqo"
1.235 -- N'ko (Guinea) -- "nqo-GN"
Run Code Online (Sandbox Code Playgroud)

为了简洁起见,我只用一种或两种文化来说明每种类型的输出.我尝试过搜索所有文化CultureInfo.GetCultures(CultureTypes.AllCultures),并且N'Ko(nqonqo-GN)是唯一给出3 dp的文化.

注意,这不是特定于double类型.如果您还可以number使用以下任意一行替换上述代码中的声明,您将得到类似的结果:

float number = 1.2345678f;
decimal number = new decimal(1.2345678);
int number = 1;
BigInteger number = new BigInteger(1);
Run Code Online (Sandbox Code Playgroud)

经过一些研究,我想问题是NumberFormatInfo.NumberDecimalDigitsN'Ko文化被设置为3,其他文化被设置为2.但我找不到任何实际情况,说明情况就是这样,或者为什么会是这种情况.

Assert.AreEqual(2, new CultureInfo("en-US").NumberFormat.NumberDecimalDigits); // true (for every culture except N'Ko [nqo and nqo-GN])
Assert.AreEqual(3, new CultureInfo("nqo").NumberFormat.NumberDecimalDigits); // true (for N'Ko)
Run Code Online (Sandbox Code Playgroud)

维基百科关于N'Ko字母的文章列出了从U + 07C0开始的N'ko数字(߀߁߃߄߅߆߇߈߉)的Unicode字符,有权 -左右方向性,并在Unicode 5(2006年7月)中介绍.它还有一个关于"N'ko和计算机"的部分,但目前与此问题没有任何关系.固定点格式似乎没有使用N'Ko数字.

任何人都可以提供一些见解,为什么微软选择将这种文化的固定点("F")数字格式化为与世界上所有其他文化不同的小数位数?

我很好奇,找不到任何东西.N'Ko如何在小数点后分组数字有什么特别之处吗?是正确显示第二个所需的第三个小数位(例如由于连字或类似)?或者是微软通过制作NumberDecimalDigits非静态的方式让开发人员保持警惕?或者这是一个错误?还是有其他文化原因?

Ben*_*ghs 4

我一直在挖掘 .net 代码,发现文化是如何实例化和创建的,以及默认值是如何在您的窗口中设置的。因此,您可以通过转到区域设置来查看默认值。如果您选择 nqo,您将看到小数点后的默认位数为 3,因此 .NET 返回 3 而不是 2。

看截图:

在此输入图像描述

我知道这并不是真正关于你如何做的答案,但你现在知道为什么了。

我很着迷,并在谷歌上搜索了一段时间,我唯一发现的是这个链接,我在谷歌中使用了这个术语:“n'ko”数字,第二个链接是这个http://www.languagesandnumbers.com /how-to-count-in-mandinka/en/mnk/这是关于曼丁卡数字的,这是几内亚使用的一种系统

然后我发现了计算器:

https://github.com/ckairaba/calculator-nko

也许通过使用它你会获得更多信息