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

681

Я хочу добавить запятую в тысячу мест для числа. String.Format()?

Теги:

20 ответов

928
Лучший ответ
String.Format("{0:n}", 1234); //Output: 1,234.00

string.Format("{0:n0}", 9876); // no digits after the decimal point. Output: 9,876
  • 35
    String.Format("{0:#,##0}", 1234); также работает без десятичных знаков.
  • 7
    Как я могу повторить спецификатор "N", но с таким количеством десятичных цифр, сколько присутствует в числе?
Показать ещё 13 комментариев
318

Я нашел, что это самый простой способ:

myInteger.ToString("N0")
  • 1
    Вы также можете использовать его с string.Format, как в string.Format («Вот некоторое число с запятыми, без десятичных дробей, {0: N0}», 123456789 (;
  • 14
    не должно ли это быть myInteger.ToString ("N0") ... string.tostring Я не думаю, что будет работать.
Показать ещё 4 комментария
128
int number = 1000000000;
string whatYouWant = number.ToString("#,##0");
//You get: 1,000,000,000
  • 26
    Это решение не является хорошим с точки зрения интернационализации - другие культуры используют , кроме символов , в качестве разделителя тысяч, например , место или даже . ,
  • 5
    Работает спасибо + 1. Расширили, так что показывает до 2 дп число. ToString ("#, ## 0. ##")
Показать ещё 7 комментариев
90

Если вы хотите, чтобы культура была специфичной, вы можете попробовать следующее:

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

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

Примечание. В некоторых культурах используется , для обозначения десятичного, а не ., поэтому будьте осторожны.

67

Стандартные форматы со связанными с ними выходами

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
  • 1
    Этот ответ упаковал много полезной информации. Изучая на примере, я теперь вижу, что означают 0 и 1 в строковом формате.
33

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

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
    Что если я хочу использовать точки в качестве разделителя тысяч, а запятую в качестве десятичного разделителя?
  • 0
    @FrenkyB "{0:#.##0,##}" должно работать
Показать ещё 1 комментарий
31
String.Format("{0:#,###,###.##}", MyNumber)

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

  • 10
    Метод ": n" лучше, так как он должен учитывать язык пользователя.
  • 11
    Это правда, но не обязательно давать вам запятые в тысячу раз, потому что они уважают язык пользователя.
Показать ещё 5 комментариев
19

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

19

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

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

устанавливает формат в "19,400,320"

17

просто как это:

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

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

17

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

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"

11
int num = 98765432;
Console.WriteLine(string.Format("{0:#,#}", num));
  • 3
    Или Console.WriteLine ("{0: #, #}", num); если вы просто хотите распечатать его. Но string.Format (...) более полезен, я думаю.
9

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

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

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

Выход 19950000

8

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

7

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

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

или с помощью yourVariable

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

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

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

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

2
String.Format("0,###.###"); also works with decimal places
-2

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

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

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

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

US Locale OUTPUT: $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 ??
  • 0
    Правильно ли обнаружено, действительно ли это будет использоваться при получении экземпляра валюты, например: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); исправил код, спасибо!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню