在C#中使用逗号和小数点格式化数字

58

我需要显示一个带有逗号和小数点的数字。

例如:
情况1:小数为432324(没有逗号或小数点)。
需要显示为:432,324.00
而不是:432,324

情况2:小数为2222222.22(没有逗号)。
需要显示为:2,222,222.22

我尝试过ToString("#,##0.##"),但它没有正确地格式化它。


3
当你说“它不起作用”时,string.Format实际上在做什么? - Tomas McGuinness
2
我真的不理解你的例子,那是什么类型的格式化?(还是只有我不懂) - V4Vendetta
3
你的 ToString 格式化的结果是什么?如果你想要让 123456789 显示为 34,94,30,94,32,324.00:这里有一些神奇的逻辑,只有绿野仙踪的巫师才能理解吗? :D - Paul Zahra
2
对于寻找仅在为.00时忽略.00的情况的人,代码为:{0:#,0.##} - Worthy7
你可以像这样使用它来保留两位小数。ToString("#,##0.#0") https://dotnetfiddle.net/USmzUL - Nahid
显示剩余2条评论
12个回答

115
int number = 1234567890;
number.ToString("#,##0.00");

你将获得结果为1,234,567,890.00


在模型中,它类似于public decimal Amount{get;set;},当我输入数据库值29.1234时,在视图中得到的结果是29.12,即使我更改了数据库decimal(18,4)(原来是(18,2)),但仍然得到像29.1200这样的值,但我想要精确的值而没有任何变化,这可能吗? - SAR
这是什么鬼,这个答案被接受了吗?它给了我1 234 567 890.00。 - Toolkit
number.ToString("#,##0.00")可以得到相同的结果时,就不需要使用Convert.ToDecimal - Jeppe Stig Nielsen
4
@Toolkit 当前线程所使用的文化决定了要使用哪种分隔符。你的文化使用空格。你可能想要使用一个多载入参数的 .ToString 方法。其中一个额外的参数是格式提供程序。对于格式提供程序,你可以传递一个文化,如 CultureInfo.InvariantCulture 或者例如 CultureInfo.GetCultureInfo("en-US") 。或者你可以传递一个 NumberFormatInfo 的实例。 - Jeppe Stig Nielsen
int number = 1234567890; string formattedNumber = number.ToString("n2", CultureInfo.InvariantCulture); 整数 number 等于 1234567890; 将其格式化后的字符串为 formattedNumber,使用 CultureInfo.InvariantCulture。 - WiiLF

39
也许你只需要标准的格式化字符串"N",例如:
number.ToString("N")

它将使用千位分隔符和固定数量的小数位。千位分隔符的符号和小数点的符号取决于您使用的格式提供程序(通常为),小数位数也是如此(通常为2,如您所需)。
如果格式提供程序指定了不同数量的小数位数,并且如果您不想更改格式提供程序,则可以在N后面给出小数位数,例如.ToString("N2")。
更新:逗号之间的组大小由... 控制。
CultureInfo.CurrentCulture.NumberFormat.NumberGroupSizes

如果您没有指定特殊的格式提供程序,那么将使用默认格式来显示数组。


这似乎是最简单的答案,特别是如果您希望格式设置正确,而不受文化设置的影响。 - jmatthias

12

试一试

ToString("#,##0.00")

来自 MSDN

*“0”自定义格式规范符用作零占位符号。 如果正在进行格式化的值在格式字符串中的零出现的位置上具有数字,则将该数字复制到结果字符串中; 否则,在结果字符串中出现一个零。 小数点前最左边的零的位置和小数点后最右边的零决定了始终存在于结果字符串中的数字范围。

“00”格式规范符会使得该值四舍五入至小数前面最接近的一位数字,其中始终使用远离零的舍入方式。例如,使用“00”格式化 34.5 将导致值 35。


11

我曾经遇到过同样的问题,我想要按照电子表格中“常规”格式来显示数字,即在小数部分有意义时显示小数,否则将其截断。换句话说:

1234.56 => 1,234.56

1234 => 1,234

它需要支持小数点后的最大位数,但如果不需要则不要加上尾随的零或小数点,当然,它还需要考虑到文化差异。我没有找到一个仅使用 String.Format 的简单方法来实现这一点,但是结合使用 String.Format 和 Regex.Replace 并利用NumberFormatInfo.CurrentInfo来协助处理文化方面的问题可以解决(LinqPad C# 程序)。

string FormatNumber<T>(T number, int maxDecimals = 4) {
    return Regex.Replace(String.Format("{0:n" + maxDecimals + "}", number),
                         @"[" + System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator + "]?0+$", "");
}   

void Main(){
    foreach (var test in new[] { 123, 1234, 1234.56, 123456.789, 1234.56789123 } )
        Console.WriteLine(test + " = " + FormatNumber(test));
}

生成:

123 = 123
1234 = 1,234
1234.56 = 1,234.56
123456.789 = 123,456.789
1234.56789123 = 1,234.5679

1
这是我个人见过的最好的答案。我正在使用一个稍微修改过的版本作为扩展方法。干得好! - Tyler Kalosza

11

尝试一下

ToString("#,##0.###")

输出结果:

1234.55678 => 1,234.556

1234 => 1,234


这是甜蜜的解决方案。 - MDM
这不是他要求的,但正是我所需要的。 - Guy Biber

10

对于 Razor 视图:

$@string.Format("{0:#,0.00}",item.TotalAmount)

8
CultureInfo us = new CultureInfo("en-US");
TotalAmount.ToString("N", us)

CultureInfo us = new CultureInfo("en-US") 对我有用 - Toolkit

5

只需要写"#,0.00",c#会自动完成其余部分。

Num.ToString("#,0.00")

  • "#,0"格式化数字的千分位分隔符
  • "0.00"强制保留两位小数

4

您的问题不是很清楚,但这应该可以实现您想要做的事情:

decimal numericValue = 3494309432324.00m;
string formatted = numericValue.ToString("#,##0.00");

那么formatted将包含:3,494,309,432,324.00

2
如果您正在使用字符串变量,可以直接使用:格式化字符串,然后指定格式(例如N0、P2等)。最初的回答。
decimal Number = 2000.55512016465m;
$"{Number:N}" #Outputs 2,000.55512016465

你可以通过在末尾添加数字来指定要显示的小数位数,例如:Original Answer翻译成"最初的回答",如果想要显示两位小数,可以写成:Original Answer翻译成"最初的回答".
$"{Number:N1}" #Outputs 2,000.5
$"{Number:N2}" #Outputs 2,000.55
$"{Number:N3}" #Outputs 2,000.555
$"{Number:N4}" #Outputs 2,000.5551

这对我有用。因为我使用了十进制。谢谢@Marcello B - O. Okoye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接