.NET String.Format () для добавления запятых в тысячах мест для числа

Я хочу добавить запятую в тысячном месте для числа.

String.Format()?

19.09.2008 21:26:21
21 ОТВЕТ
РЕШЕНИЕ
String.Format("{0:n}", 1234);  // Output: 1,234.00
String.Format("{0:n0}", 9876); // No digits after the decimal point. Output: 9,876
1200
7.11.2018 00:30:22
String.Format("{0:#,##0}", 1234);также работает без десятичных знаков.
Greg Bray 5.11.2010 03:50:33
Как я могу повторить спецификатор "N", но с таким количеством десятичных цифр, сколько присутствует в числе?
Stephen Drew 23.11.2012 10:33:50
@Justin: Согласно msdn.microsoft.com/en-us/library/0c899ak8.aspx , «,» (и «.») Заменяются правильными локализованными символами.
Roger Lipscombe 4.03.2013 09:29:12
@RogerLipscombe Я не понял этого
Justin 4.03.2013 09:58:25
@VVVV - тогда вы, вероятно, передаете строку вместо числа . Если у вас есть строка, вам нужно сначала конвертировать в float или double. Попробуйтеstring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve 26.10.2017 02:51:04
String.Format("{0:#,###,###.##}", MyNumber)

Это даст вам запятые в соответствующих точках.

34
11.05.2014 18:24:22
Метод ": n" лучше, так как он должен учитывать язык пользователя.
Torlack 19.09.2008 21:30:09
Это правда, но не обязательно давать вам запятые в тысячу раз, потому что они уважают язык пользователя.
Stephen Wrighton 19.09.2008 21:35:13
Вернемся к вам: это правда, но это не гарантирует уважения к языку пользователя, потому что он использует запятые в качестве разделителя тысяч. (Например, в Португалии запятая вместо десятичного разделителя.)
ANeves 19.05.2010 17:46:51
Если вы хотите применить значения после. вам нужно заменить # на 0. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : ноль заменяет ноль соответствующей цифрой, если она есть; в противном случае в результирующей строке появляется ноль, а символ «#» заменяется соответствующей цифрой, если она есть; в противном случае никакая цифра не появляется в строке результата.
Clarice Bouwer 6.02.2014 09:29:07
этот метод работал нормально для моего требования, страница msdn о методе Int32.ToString, который будет основным местом его использования msdn.microsoft.com/en-us/library/8wch342y.aspx , не очень полезна для этого конкретного приложение либо
stackuser83 25.03.2014 00:24:03

Обратите внимание, что форматируемое значение должно быть числовым. Не похоже, что он займет строковое представление числа и формат с запятыми.

8
12.10.2008 00:35:09
int number = 1000000000;
string whatYouWant = number.ToString("#,##0");
//You get: 1,000,000,000
146
19.05.2010 17:26:35
Это решение не годится с точки зрения интернационализации - другие культуры используют символы, отличные от ,разделителя тысяч, например пробел или даже ..
Justin 31.01.2012 17:04:17
Работает, спасибо + 1. Расширены, так что показывает до 2 дп число. ToString ("#, ## 0. ##")
Crab Bucket 30.03.2012 10:38:56
@MacSigler На самом деле это не так, см. Комментарий Роджера Липскомба к ответу выше: String.Format будет применять локализацию автоматически.
Dan Bechard 17.10.2013 19:34:27
@MacSigler В том-то и дело, что этот код не всегда выводит запятую. Только тогда, когда культура ожидает запятые (например, en-US или инвариант). Если в культуре ожидается другой разделитель (например .), .NET автоматически заменит запятую на этот разделитель. Опять же, я призываю вас прочитать ссылку, опубликованную Роджером, если вы все еще не понимаете, почему это так.
Dan Bechard 18.10.2013 18:33:33
@MacSigler Комментарий Джастина по-прежнему верен в том, что если вы явно не навязываете культуру en-US, она унаследует настройки культуры от локальной машины. Насколько я понимаю, компиляция приведенного выше кода, а затем запуск его на двух машинах с разными культурами (с разными разделителями чисел) даст разные результаты. Если вы хотите, чтобы он всегда производил запятую, вам нужно явно установить культуру, которая использует запятую (например, инвариант).
Dan Bechard 22.10.2013 14:12:41
int num = 98765432;
Console.WriteLine(string.Format("{0:#,#}", num));
11
20.05.2010 15:36:29
Или Console.WriteLine ("{0: #, #}", num); если вы просто хотите распечатать его. Но string.Format (...) более полезен, я думаю.
Indy9000 25.08.2011 14:42:58

Я обнаружил, что это самый простой способ:

myInteger.ToString("N0")
378
18.05.2016 13:48:00
Вы также можете использовать его с string.Format, как и в string.Format («Вот какое-то число с запятыми, без десятичных дробей, {0: N0}», 123456789 (;
Dan Morphis 21.10.2011 02:52:46
не должно ли это быть myInteger.ToString ("N0") ... string.tostring Я не думаю, что будет работать.
Taylor Brown 14.05.2014 22:05:52
Я знаю, что прошло уже 5 лет, но спасибо! Это работает для чисел> 4 символов и <4 символов.
AskYous 18.05.2015 16:21:33
@AskYous - Ну, это также работает для 4 символов. Можно сказать, что это работает для любой длины.
Broots Waymb 17.11.2017 15:27:55
Это работает, но меняется в региональных настройках
saulyasar 27.03.2018 14:38:22

Если вы хотите конкретную культуру, вы можете попробовать это:

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

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

Примечание: некоторые культуры используют ,для обозначения десятичной, а не .осторожны.

98
23.12.2014 11:18:22

Метод, который я использовал, чтобы больше не беспокоиться о культурах и потенциальных проблемах форматирования, заключается в том, что я отформатировал его как валюту и впоследствии вынул символ валюты.

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

{
  formattedValue = result.ToString("C").Substring(1);
}
-2
13.06.2012 09:55:01
Этот код не зависит от культуры - он будет использовать любую культуру по умолчанию, установленную на компьютере, на котором выполняется код. Это может создать нежелательный вывод, когда эта культура помещает свои символы валюты в конце числа, а не в начале (например fr-FR), или использует более одного символа для обозначения валюты (например da-DK), или не разделяет тысячи, используя запятые (например, большинство материковой Европы).
raveturned 13.06.2012 21:08:53

Например String.Format("{0:0,0}", 1);возвращает 01, для меня не действует

Это работает для меня

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

выход 19,950,000

9
23.10.2012 21:19:57

Стандартные форматы с соответствующими выводами,

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

Пример вывода (культура en-us):

(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
76
12.12.2014 16:19:17
Этот ответ упаковал много полезной информации. Изучая на примере, я теперь вижу, что означают 0 и 1 в строковом формате.
user420667 2.11.2016 16:58:08

Если вы хотите принудительно использовать разделитель «,» независимо от культуры (например, в трассировке или сообщении журнала), следующий код будет работать и даст дополнительное преимущество: он скажет следующему парню, который наткнется на него, именно то, что вы делаете.

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

наборы в формате "19 400 320"

21
27.03.2013 19:55:29

Ниже приведено хорошее решение в 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");

ВЫХОД: 9 999 999,00 рупий

Эстонский Локаль выход

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

ВЫХОД: 9 999 999 €

Как вы можете видеть в различных выходах вам не придется беспокоиться о Сепараторе быть запятой или точки или даже пространство вы можете получить номер отформатированных в соответствии со стандартами i18n

-2
22.12.2013 06:06:01
где вы использовали переменную locale ??
Smith 21.12.2013 20:29:45
Правильно ли обнаружено, действительно ли это будет использоваться при получении экземпляра валюты, например: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); исправил код, спасибо!
Anirudh 22.12.2013 06:05:22
Вы проверили теги? Вопрос о C #, а не о Java!
Salar 21.09.2015 04:50:14

Если вы хотите показать его в 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
-3
28.11.2013 03:36:47

Вы можете использовать такую ​​функцию, как эта, для форматирования чисел и, при необходимости, для передачи нужных десятичных знаков. Если десятичные знаки не указаны, будут использоваться два десятичных знака.

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

Я использую десятичную, но вы можете изменить тип на любой другой или использовать анонимный объект. Вы также можете добавить проверку ошибок для отрицательных десятичных разрядов.

3
23.12.2014 11:13:38

Это лучший формат. Работает во всех этих случаях:

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
40
9.07.2015 23:43:49
Что если я хочу использовать точки в качестве разделителя тысяч, а запятую в качестве десятичного разделителя?
FrenkyB 12.09.2017 14:16:09
проголосовал, потому что он отображает не 12 314,0 (как в формате n1), а 12 314 :)
NDUF 26.04.2018 08:59:24

Ответ, получивший наибольшее количество голосов, был великолепным и помогал около 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) не изменилось. Для получения полной информации о том, что нового, вы можете перейти на эту страницу .

33
12.08.2015 02:51:49

Проще, используя строковую интерполяцию вместо String.Format

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

или используя yourVariable

 double yourVariable = 12456.0;
 $"{yourVariable:n0}"; 
 $"{yourVariable:n2}"; 
11
2.11.2016 20:22:05

В следующем примере отображаются несколько значений, отформатированных с использованием строк нестандартного формата, которые содержат нулевые заполнители.

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"

20
7.03.2017 12:11:31
хороший ответ, но как насчет 29.255,00?
Roxy'Pro 10.05.2019 11:15:02
@ Roxy'Pro Изменить локаль / культуру?
Maarten Bodewes 12.05.2019 19:32:25
@MaartenBodewes Я думал, что есть соответствующее письмо типа «N1», «F1» или что-то в этом роде =) Но изменение культуры будет работать определенно ..
Roxy'Pro 12.05.2019 21:59:38

просто так:

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

Больше информации здесь

29
24.08.2017 05:08:32
String.Format("0,###.###"); also works with decimal places
5
13.02.2018 12:20:52

C # 7.1 (возможно, раньше?) Делает это так просто и красиво, как и должно быть, с интерполяцией строк:

var jackpot = 1000000;
var niceNumberString = $"Jackpot is {jackpot:n}";
var niceMoneyString = $"Jackpot is {jackpot:C}";
5
9.02.2019 13:21:27