.NET String.Format()在数千个数字中添加逗号


Answers:


1216
String.Format("{0:n}", 1234);  // Output: 1,234.00
String.Format("{0:n0}", 9876); // No digits after the decimal point. Output: 9,876

39
String.Format("{0:#,##0}", 1234);也可以不带小数位。
格雷格·布雷

9
我该如何复制“ N”说明符,但要保留多少个十进制数字?
Stephen Drew 2012年

56
@Justin:根据msdn.microsoft.com/zh-cn/library/0c899ak8.aspx,用正确的本地化字符替换了','(和'。')。
Roger Lipscombe

@RogerLipscombe我没有意识到
贾斯汀

6
@VVVV-那么您可能正在传递字符串而不是数字。如果您有字符串,则需要先转换为float或double。试试string.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve

378

我发现这是最简单的方法:

myInteger.ToString("N0")

1
您也可以将其与string.Format一起使用,如string.Format(“这里是一些带逗号的数字,没有小数,{0:N0}”,123456789(;
Dan Morphis

16
不应该是myInteger.ToString(“ N0”)... string.tostring我认为不行。
泰勒·布朗

1
我知道已经过去5年了,但是谢谢!它适用于数字> 4个字符和<4个字符。
AskYous

@AskYous-好吧,它也适用于4个字符。
Broots Waymb '17

这是
可行的,

149
int number = 1000000000;
string whatYouWant = number.ToString("#,##0");
//You get: 1,000,000,000

27
从国际化的角度来看,这种解决方案不是很好-其他文化使用的字符不是,千位分隔符,例如空格或偶数.
贾斯汀

6
谢谢+作品。1.已扩展,因此最多可显示2个dp.ToString(“#,## 0。##”)
Crab Bucket 2012年

8
@MacSigler事实并非如此,请参见Roger Lipscombe对以上答案的评论:String.Format将自动应用本地化。
丹·贝查德

10
@MacSigler就是这样,这段代码并不 总是打印出逗号。仅当文化是一种期望逗号(例如,en-US或不变式)时。如果区域性是期望使用另一个分隔符(例如.)的语言,则.NET将自动用该分隔符替换逗号。再次提醒您,如果您仍然不明白为什么这样做,请阅读罗杰(Roger)发布的链接。
Dan Bechard

4
@MacSigler Justin的评论仍然是正确的,因为如果您没有明确强制区域性进入美国,它将从本地计算机继承区域性设置。我的理解是,编译上面的代码,然后在具有不同区域性(带有不同数字分隔符)的两台计算机上运行它,将会产生不同的结果。如果希望它始终产生逗号,则需要显式设置使用逗号的区域性(例如,不变式)。
丹·贝查德

98

如果要特定于文化,则可以尝试以下操作:

(19950000.0).ToString("N",new CultureInfo("en-US")) = 19,950,000.00

(19950000.0).ToString("N",new CultureInfo("is-IS")) = 19.950.000,00

注意:有些文化习惯用,小数表示,而不要.小心。


77

标准格式及其相关输出,

Console.WriteLine("Standard Numeric Format Specifiers");
String s = String.Format("(C) Currency: . . . . . . . . {0:C}\n" +
                    "(D) Decimal:. . . . . . . . . {0:D}\n" +
                    "(E) Scientific: . . . . . . . {1:E}\n" +
                    "(F) Fixed point:. . . . . . . {1:F}\n" +
                    "(G) General:. . . . . . . . . {0:G}\n" +
                    "    (default):. . . . . . . . {0} (default = 'G')\n" +
                    "(N) Number: . . . . . . . . . {0:N}\n" +
                    "(P) Percent:. . . . . . . . . {1:P}\n" +
                    "(R) Round-trip: . . . . . . . {1:R}\n" +
                    "(X) Hexadecimal:. . . . . . . {0:X}\n",
                    - 1234, -1234.565F);
Console.WriteLine(s);

输出示例(使用我们的文化):

(C) Currency: . . . . . . . . ($1,234.00)
(D) Decimal:. . . . . . . . . -1234
(E) Scientific: . . . . . . . -1.234565E+003
(F) Fixed point:. . . . . . . -1234.57
(G) General:. . . . . . . . . -1234
    (default):. . . . . . . . -1234 (default = 'G')
(N) Number: . . . . . . . . . -1,234.00
(P) Percent:. . . . . . . . . -123,456.50 %
(R) Round-trip: . . . . . . . -1234.565
(X) Hexadecimal:. . . . . . . FFFFFB2E

2
这个答案包含了许多有用的信息。通过示例学习,我现在看到0和1在字符串格式中的含义。
user420667 '16

41

这是最好的格式。适用于所有这些情况:

String.Format( "{0:#,##0.##}", 0 ); // 0
String.Format( "{0:#,##0.##}", 0.5 ); // 0.5 - some of the formats above fail here. 
String.Format( "{0:#,##0.##}", 12314 ); // 12,314
String.Format( "{0:#,##0.##}", 12314.23123 ); // 12,314.23
String.Format( "{0:#,##0.##}", 12314.2 ); // 12,314.2
String.Format( "{0:#,##0.##}", 1231412314.2 ); // 1,231,412,314.2

1
如果我想将点作为千位分隔符并将逗号作为十进制分隔符怎么办?
FrenkyB

投票是因为它不显示12,314.0(如n1格式),但显示12,314 :)
NDUF

34
String.Format("{0:#,###,###.##}", MyNumber)

这将在相关点给您逗号。


10
“:n”方法更好,因为它应该尊重用户的语言环境。
Torlack

12
的确如此,但是由于它尊重用户的语言环境,因此不能保证在千位上给您逗号。
斯蒂芬·赖顿

2
马上对您说:是的,但是不能保证尊重用户的语言环境,因为它使用逗号作为千位分隔符。(例如,在葡萄牙,逗号代替小数点分隔符。)
ANeves,2010年

1
如果要在后面强制执行值。您需要将#替换为0。msdn.microsoft.com/zh-cn/library/0c899ak8(v=vs.110).aspx:如果存在一个零,则零将其替换为相应的数字;否则,结果字符串中将出现零,而如果存在数字,则将“#”符号替换为相应的数字;否则,结果字符串中不会出现数字。
Clarice Bouwer 2014年

此方法可以满足我的要求,有关Int32.ToString方法的msdn页面将是主要位置,msdn.microsoft.com / en-us / library / 8wch342y.aspx 对于此特定对象不是很有帮助应用程序之一
stackuser83 2014年

33

投票最多的答案很棒,并且已经帮助了大约7年。随着C#6.0的引入,特别是String Interpolation的引入,出现了一种更整齐,更安全的IMO方法to add commas in thousands place for a number

var i = 5222000;
var s = $"{i:n} is the number"; // results to > 5,222,000.00 is the number
s = $"{i:n0} has no decimal"; // results to > 5,222,000 has no decimal

将变量i 放在占位符处的位置(即{0})。因此,无需记住哪个对象到达哪个位置。格式(即:n)未更改。有关新功能的完整功能,您可以转到此页面


29

就这么简单:

float num = 23658; // for example 
num = num.ToString("N0"); // Returns 23,658

更多信息在这里


21

如果您希望强制使用“,”分隔符而不考虑其区域性(例如在跟踪或日志消息中),则以下代码将起作用,并具有告诉下一个偶然发现您正在执行的操作的下一个家伙的额外好处。

int integerValue = 19400320; 
string formatted = string.Format(CultureInfo.InvariantCulture, "{0:N0}", integerValue);

集的格式设置为“ 19,400,320”


21

下面的示例显示多个值,这些值使用包含零个占位符的自定义格式字符串进行了格式化。

String.Format("{0:N1}", 29255.0);

要么

29255.0.ToString("N1")

结果“ 29,255.0”

String.Format("{0:N2}", 29255.0);

要么

29255.0.ToString("N2")

结果“ 29,255.00”


好的答案,但是29.255,00呢?
Roxy'Pro

@ Roxy'Pro更改语言环境/文化?
Maarten Bodewes,

@MaartenBodewes我以为有相应的字母,例如“ N1”,“ F1”或类似的字母=)但是,改变文化
确实

11
int num = 98765432;
Console.WriteLine(string.Format("{0:#,#}", num));

3
或Console.WriteLine(“ {0:#,#}”,num); 如果您只想打印它。但是string.Format(...)更有用。
2011年

11

更简单,使用字符串插值代替String.Format

 $"{12456:n0}"; // 12,456
 $"{12456:n2}"; // 12,456.00

或使用yourVariable

 double yourVariable = 12456.0;
 $"{yourVariable:n0}"; 
 $"{yourVariable:n2}"; 

9

例如 String.Format("{0:0,0}", 1);返回01,对我来说无效

这对我有用

19950000.ToString("#,#", CultureInfo.InvariantCulture));

输出19,950,000


8

请注意,您要格式化的值应为数字。看起来它不会采用数字的字符串表示形式,并且格式带有逗号。



5

C#7.1(也许更早吗?)通过字符串插值使此操作看起来应尽可能简单和美观:

var jackpot = 1000000;
var niceNumberString = $"Jackpot is {jackpot:n}";
var niceMoneyString = $"Jackpot is {jackpot:C}";

3

您可以使用诸如此类的函数来格式化数字并有选择地传递所需的小数位。如果未指定小数位,它将使用两个小数位。

    public static string formatNumber(decimal valueIn=0, int decimalPlaces=2)
    {
        return string.Format("{0:n" + decimalPlaces.ToString() + "}", valueIn);
    }

我使用十进制,但您可以将类型更改为其他任何类型,也可以使用匿名对象。您还可以添加错误检查来确定负的小数位数。


-2

我以前不再担心文化和潜在格式问题的方法是,将其格式化为货币,然后取出货币符号。

if (decimal.TryParse(tblCell, out result))

{
  formattedValue = result.ToString("C").Substring(1);
}

6
该代码不是独立于区域性的,而是将使用在运行该代码的计算机上设置的任何默认区域性。这可能会产生不希望的输出,在这种文化中,其文化将货币符号放在数字的末尾而不是开头(例如fr-FR),或者使用多个字符来表示货币(例如da-DK),或者不使用逗号分隔数千个字符(例如,大多数欧洲大陆)。
2012年

-2

下面是Java中的一个很好的解决方案!

NumberFormat fmt = NumberFormat.getCurrencyInstance();
System.out.println(fmt.format(n));

或者以更健壮的方式,您可能想要获取特定位置的语言环境,然后使用以下方法:

int n=9999999;
Locale locale = new Locale("en", "US");
NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
System.out.println(fmt.format(n));

美国地区输出:$ 9,999,999.00

德国语言环境输出

Locale locale = new Locale("de", "DE");

输出:9.999.999,00€

印度语言环境输出

Locale locale = new Locale("de", "DE");

输出:Rs.9,999,999.00

爱沙尼亚语言环境输出

Locale locale = new Locale("et", "EE");

输出:9 999 999€

正如您在不同输出中看到的那样,您不必担心分隔符是逗号还是空格,您可以根据i18n标准格式化数字


1
您在哪里使用变量locale
史密斯

正确正确地发现,它是否在获取货币实例时使用,例如:NumberFormat fmt = NumberFormat.getCurrencyInstance(locale); 更正了代码,谢谢!
2013年

3
您检查过标签了吗?问题是关于C#而不是Java!
萨拉尔

-3

如果要在DataGridview中显示它,则应更改其类型,因为默认值为String,并且由于将其更改为十进制,因此将其视为带浮点数的Number。

Dim dt As DataTable = New DataTable
dt.Columns.Add("col1", GetType(Decimal))
dt.Rows.Add(1)
dt.Rows.Add(10)
dt.Rows.Add(2)

DataGridView1.DataSource = dt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.