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

Ответы:

1216
String.Format("{0:n}", 1234);  // Output: 1,234.00
String.Format("{0:n0}", 9876); // No digits after the decimal point. Output: 9,876
Seibar
источник
39
String.Format("{0:#,##0}", 1234);также работает без десятичных знаков.
Грег Брей
9
Как я могу повторить спецификатор "N", но с таким количеством десятичных цифр, сколько присутствует в числе?
Стивен Дрю
56
@Justin: Согласно msdn.microsoft.com/en-us/library/0c899ak8.aspx , «,» (и «.») Заменяются правильными локализованными символами.
Роджер Липскомб
@RogerLipscombe Я не понял этого
Джастин
6
@VVVV - тогда вы, вероятно, передаете строку вместо числа . Если у вас есть строка, вам нужно сначала конвертировать в float или double. Попробуйтеstring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve
379

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

myInteger.ToString("N0")
алхимический
источник
1
Вы также можете использовать его с string.Format, как в string.Format («Вот некоторое число с запятыми и без десятичных дробей, {0: N0}», 123456789 (;
Дэн Морфис
16
не должно быть myInteger.ToString ("N0") ... string.tostring, я не думаю, что это сработает.
Тейлор Браун
1
Я знаю, что прошло уже 5 лет, но спасибо! Это работает для чисел> 4 символов и <4 символов.
AskYous
@AskYous - Ну, это также работает для 4 символов. Можно сказать, что это работает для любой длины.
Брутс Уэймб
Это работает, но меняется в региональных настройках
saulyasar
149
int number = 1000000000;
string whatYouWant = number.ToString("#,##0");
//You get: 1,000,000,000
p.campbell
источник
27
Это решение не годится с точки зрения интернационализации - другие культуры используют символы, отличные от ,разделителя тысяч, например пробел или даже ..
Джастин
6
Работает, спасибо + 1. Расширены, так что показывает до 2 дп число. ToString ("#, ## 0. ##")
Crab Bucket
8
@MacSigler На самом деле это не так, см. Комментарий Роджера Липскомба к ответу выше: String.Format будет применять локализацию автоматически.
Дэн Бешард
10
@MacSigler В том-то и дело, что этот код не всегда выводит запятую. Только тогда, когда культура ожидает запятые (например, en-US или инвариант). Если для культуры требуется другой разделитель (например .), .NET автоматически заменит запятую на этот разделитель. Опять же, я призываю вас прочитать ссылку, опубликованную Роджером, если вы все еще не понимаете, почему это так.
Дэн Бешард
4
@MacSigler Комментарий Джастина по-прежнему верен в том, что если вы явно не навязываете культуру в en-US, она унаследует настройки культуры от локальной машины. Насколько я понимаю, компиляция приведенного выше кода, а затем запуск его на двух машинах с разными культурами (с разными разделителями чисел) даст разные результаты. Если вы хотите, чтобы он всегда производил запятую, вам нужно явно установить культуру, которая использует запятую (например, инвариант).
Дэн Бешард
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

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

Prabir
источник
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);

Пример вывода (культура 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
CoderTao
источник
2
Этот ответ упаковал много полезной информации. Изучая на примере, я теперь вижу, что означают 0 и 1 в строковом формате.
user420667
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" лучше, так как он должен учитывать язык пользователя.
Торлак
12
Это правда, но не обязательно давать вам запятые в тысячу раз, потому что они уважают язык пользователя.
Стивен Райтон
2
Вернемся к вам: это правда, но не гарантируется соблюдение языкового стандарта пользователя, поскольку он использует запятые в качестве разделителя тысяч. (Например, в Португалии запятая вместо десятичного разделителя.)
ANeves
1
Если вы хотите применить значения после. вам нужно заменить # на 0. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : ноль заменяет ноль соответствующей цифрой, если она есть; в противном случае в результирующей строке появляется ноль, а символ «#» заменяется соответствующей цифрой, если она есть; в противном случае никакая цифра не появляется в строке результата.
Клариса Бувер
этот метод работал нормально для моего требования, страница msdn о методе Int32.ToString, который будет основным местом его использования msdn.microsoft.com/en-us/library/8wch342y.aspx , не очень полезна для этого конкретного приложение либо
stackuser83
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) не изменилось. Для получения полной информации о том, что нового, вы можете перейти на эту страницу .

фон v.
источник
29

просто так:

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

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

a_m_dev
источник
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 Изменить локаль / культуру?
Мартен Бодевес
@MaartenBodewes Я думал, что есть соответствующее письмо типа «N1», «F1» или что-то в этом роде =) Но изменение культуры будет работать определенно ..
Roxy'Pro
11
int num = 98765432;
Console.WriteLine(string.Format("{0:#,#}", num));
p.campbell
источник
3
Или Console.WriteLine ("{0: #, #}", num); если вы просто хотите распечатать его. Но string.Format (...) более полезен, я думаю.
Indy9000
11

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

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

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

 double yourVariable = 12456.0;
 $"{yourVariable:n0}"; 
 $"{yourVariable:n2}"; 
brakeroo
источник
9

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

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

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

выход 19,950,000

cmujica
источник
8

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


источник
6

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

var jackpot = 1000000;
var niceNumberString = $"Jackpot is {jackpot:n}";
var niceMoneyString = $"Jackpot is {jackpot:C}";
Марк Жуковский
источник
5
String.Format("0,###.###"); also works with decimal places
Абольфазл Растгу
источник
3

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

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

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

dunwan
источник
-2

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

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

{
  formattedValue = result.ToString("C").Substring(1);
}
8 Джон Воланте
источник
6
Этот код не зависит от культуры - он будет использовать любую культуру по умолчанию, установленную на компьютере, на котором выполняется код. Это может создать нежелательный вывод, когда эта культура помещает свои символы валюты в конце числа, а не в начале (например fr-FR), или использует более одного символа для обозначения валюты (например da-DK), или не разделяет тысячи, используя запятые (например, большинство материковой части Европы).
raveturned
-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");

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

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

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

ВЫХОД: 9 999 999 €

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

Anirudh
источник
1
где вы использовали переменную locale ??
Смит
Правильно ли обнаружено, действительно ли это будет использоваться при получении экземпляра валюты, например: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); исправил код, спасибо!
Анируд
3
Вы проверили теги? Вопрос о C #, а не о Java!
Салар
-3

Если вы хотите показать его в DataGridview, вы должны изменить его тип, потому что по умолчанию это String, а поскольку вы меняете его на десятичный, он считается как число с плавающей запятой

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
Али
источник