3

我认为这很简单;.Net 框架有很多功能可以完全按照您的需要格式化数字,但我仍然无法完成这项工作。

问题:根据欧洲规则显示一个数字,所以用“。” 用于千位分隔符和“,”用于小数分隔符,但不固定小数位数。

因此,例如,如果我有 1234,则应该打印为"1.234",而 1234.5 应该打印为"1.234,5"。但是我尝试过的所有格式都没有做到这一点!

示例:假设这ci是具有正确设置的 CultureInfo,则

num.ToString(ci)      -> "1234,5"   小数可以,但没有千位分隔符
num.ToString("G", ci) -> "1234,5"   与上面的千位分隔符相同
num.ToString("N", ci) -> "1.234,50" 可以,但是小数太多

等等。与使用 aNumberFormatInfo而不是 aCultureInfo或尝试String.Formator类似Convert.ToString。有人有其他想法吗?

4

2 回答 2

2

您可以像这样硬编码格式字符串

num.ToString("###,###,###.####");

这将输出关于 tu 当前线程文化信息。如果你有欧洲文化,你会得到“。” 作为千位分隔符。这将输出最多 4 个不等于 0 的小数。如果您有更大的数字或需要更高的精度,您可以增加小数位数和组数。但是,不确定是否有更优雅的方式......

于 2013-05-13T13:58:49.297 回答
0

也许你正在寻找这个:

number.ToString("#,##0.##", customCulture);

使用示例:

double first = 12345.67;
double second = 1234567;
var customCulture = (System.Globalization.CultureInfo)
    System.Globalization.CultureInfo.CurrentCulture.Clone();
customCulture.NumberFormat.NumberDecimalSeparator = ",";
customCulture.NumberFormat.NumberGroupSeparator = ".";
Console.WriteLine("First :    " + first.ToString("#,##0.##", customCulture));
Console.WriteLine("Second: "   + second.ToString("#,##0.##", customCulture));

如果没有定义确切的文化信息,您无法保证在任何文化中都获得相同的结果。

这是我在控制台中得到的结果:

First :    12.345,67
Second: 1.234.567
于 2013-05-13T14:29:22.683 回答