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

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

String.Format()?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
902
0
764 760
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

Как я могу воспроизвести спецификатор «N», но с таким количеством десятичных цифр, которое присутствует в числе?

Stephen Drew 23.11.2012 14:33

@Justin: Согласно msdn.microsoft.com/en-us/library/0c899ak8.aspx, ',' (и '.') Заменяются правильными локализованными символами.

Roger Lipscombe 04.03.2013 13:29

Коротко и легко читается, но целое число помещается в рамку при передаче в качестве аргумента. Я предпочитаю ответ @alchemical.

Attila Klenik 04.08.2015 22:30

Если вы хотите, чтобы на вашей странице был десятичный формат, отличный от формата, определенного системой, вы можете изменить CurrentCulture, как в этом примере: var nlBE = new System.Globalization.CultureInfo("nl-BE"); nlBE.NumberFormat.CurrencyDecimalDigits = 2; nlBE.NumberFormat.CurrencyDecimalSeparator = ","; nlBE.NumberFormat.CurrencyGroupSeparator = "."; System.Threading.Thread.CurrentThread.CurrentCulture = nlBE;

DerpyNerd 11.10.2016 09:05

для меня он не работает, используя "{0:n0}", все еще дает мне 2.40

hud 11.08.2017 17:23

@VVVV - тогда вы, вероятно, передаете нить вместо номер. Если у вас есть строка, вам нужно сначала преобразовать ее в float или double. Попробуйте string.Format("{0:n0}", Double.Parse(yourValue));

ToolmakerSteve 26.10.2017 05:51

Чтобы воспроизвести поведение спецификатора n, но с таким количеством десятичных цифр, которые присутствуют в самом числе, мне пришлось использовать эту строку формата вместо #,##0.## (из другого ответа здесь)

evilkos 14.02.2018 12:37

строковая интерполяция еще короче сокращенно $"{myVariable:n0}"

BuddyZ 08.04.2020 22:34

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

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

Метод ": n" лучше, так как он должен учитывать языковой стандарт пользователя.

Torlack 20.09.2008 01:30

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

Stephen Wrighton 20.09.2008 01:35

прямо к вам: это правда, но не гарантируется соблюдение языкового стандарта пользователя, потому что он использует запятые в качестве разделителя тысяч. (Например, в Португалии десятичным разделителем является запятая.)

ANeves thinks SE is evil 19.05.2010 21:46

Если вы хотите применить значения после. вам нужно заменить # на 0. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx: Ноль заменяет ноль соответствующей цифрой, если она присутствует; в противном случае в строке результата появляется ноль, тогда как символ «#» заменяется соответствующей цифрой, если она присутствует; в противном случае в строке результата не появится цифра.

Clarice Bouwer 06.02.2014 13:29

этот метод работал нормально для моих требований, страница msdn о методе Int32.ToString, который будет основным местом, где он будет использоваться msdn.microsoft.com/en-us/library/8wch342y.aspx, также не очень полезен для этого конкретного приложения.

stackuser83 25.03.2014 04:24

единственная рекомендация - строка с большой буквы S, это соглашение ... результат такой же ... но String.format ("{0: #, ###, ###. ##}", MyNumber)

Valentin Petkov 06.05.2014 17:16

Когда MyNumber равен 0, возвращает пустую строку вместо «0».

HelloWorld 22.09.2015 10:21

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

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

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

Justin 31.01.2012 21:04

Работает спасибо +1. Растянули так показывает до 2 д.п. number.ToString ("#, ## 0. ##")

Crab Bucket 30.03.2012 14:38

@Justin Это правда, но иногда требования глупы, а требования - это требования. :) Однако, как вы отметили, метод Terrapin был бы лучше, учитывая достаточную гибкость.

Mac Sigler 07.06.2013 02:29

@MacSigler На самом деле это неправда, см. Комментарий Роджера Липскомба к ответу выше: String.Format автоматически применит локализацию.

Dan Bechard 17.10.2013 23:34

@Dan Я имел в виду, что это наиболее лаконичный способ, учитывая требование о том, что запятая всегда должна быть распечатана, будь то на американском, британском или китайском компьютере. «1.000.000.000» было бы неверным, потому что (по общему признанию, глупые, но не редкость) требования требуют запятых. Я полагаю, вы могли бы пройти и сделать специальную локализацию, но это было бы излишним.

Mac Sigler 18.10.2013 21:22

@MacSigler В том-то и дело, что этот код невсегда распечатывает запятую. Только когда культура ожидает запятые (например, en-US или инвариант). Если культура предполагает другой разделитель (например, .), .NET автоматически заменит запятую этим разделителем. Опять же, я призываю вас прочитать ссылку, опубликованную Роджером, если вы все еще не понимаете, почему это так.

Dan Bechard 18.10.2013 22:33

@Dan Итак, я пошел дальше и уже прочитал ссылку. Похоже, он уже учитывает культуру, а это означает, что комментарий Джастина будет неверным (если только не требуется специально выводить результат, чуждый культуре пользователя)? В любом случае, +1 за указание на кое-что о .NET, которого я не знал раньше, и за терпение в отношении моего упрямого невежества. :)

Mac Sigler 21.10.2013 21:56

Комментарий @MacSigler Джастина по-прежнему верен в том смысле, что если вы явно не принудительно не принудительно установите язык и региональные параметры en-US, он унаследует параметры культуры с локального компьютера. Насколько я понимаю, компиляция приведенного выше кода, а затем его запуск на двух машинах с разными культурами (с разными разделителями чисел) приведет к разным результатам. Если вы хотите, чтобы всегда создавал запятую, вам необходимо явно установить язык и региональные параметры, использующие запятую (например, инвариант).

Dan Bechard 22.10.2013 18:12

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

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

Indy9000 25.08.2011 18:42

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

myInteger.ToString("N0")

Вы также можете использовать его с string.Format, например string.Format ("Вот какое-то число с запятыми, без десятичных знаков, {0: N0}", 123456789 (;

Dan Morphis 21.10.2011 06:52

Разве это не должно быть myInteger.ToString ("N0") ... string.tostring, я не думаю, что это сработает.

Taylor Brown 15.05.2014 02:05

Я знаю, что прошло уже 5 лет, но спасибо! Он работает для чисел> 4 символов и <4 символов.

AskYous 18.05.2015 19:21

@AskYous - Ну, это также работает для 4 символов .. Можно также сказать, что это работает для любой длины.

Broots Waymb 17.11.2017 18:27

Это работает, но меняется в региональных настройках

saulyasar 27.03.2018 17:38

Похоже, НЕТ.

wha7ever 18.07.2018 21:43

myInteger.ToString ("N2"), если вы хотите 2 десятичных знака, т.е. 1 234 567,89 долларов США

Michael Gervasoni 10.03.2021 07:46

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

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

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

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

Бинго! (и "N0", чтобы скрыть десятичную дробь)

Marco Antonio 25.02.2021 21:42

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

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

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

Этот код не зависит от культуры - он будет использовать любую культуру по умолчанию, установленную на машине, на которой выполняется код. Это может привести к нежелательному результату, когда эта культура помещает свои символы валюты в конец числа, а не в начало (например, fr-FR), или использует более одного символа для обозначения валюты (например, da-DK), или не разделяет тысячи запятыми ( например, большая часть континентальной Европы).

raveturned 14.06.2012 01:08

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

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

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

выход 19 950 000

но если мы возьмем значение 19950000 в переменную и сделаем так var test = "19950000"; test.ToString ("#, #", CultureInfo.InvariantCulture)); это не работает

Neo 28.09.2020 09:45

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

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: . . . . . . . . (,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

В этом ответе содержится много полезной информации. Изучая на примере, теперь я понимаю, что означают 0 и 1 в строковом формате.

user420667 02.11.2016 19:58

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

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

наборы отформатированы до "19,400,320"

Однако ниже хорошее решение на 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

где вы использовали переменную locale ??

Smith 22.12.2013 00:29

правильно ли он определен, действительно ли он будет использоваться при получении экземпляра валюты, например: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); поправил код, спасибо!

Anirudh 22.12.2013 10:05

Вы проверили теги? Речь идет о C#, а не о Java!

Salar 21.09.2015 07:50

Если вы хотите отобразить его в 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

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

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

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

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

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

Что, если мне нужны точки в качестве разделителя тысяч и запятая в качестве десятичного разделителя?

FrenkyB 12.09.2017 17:16

проголосовали за, потому что он отображает не 12314.0 (как формат n1), а 12314 :)

NDUF 26.04.2018 11:59

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

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

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

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

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

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

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 10.05.2019 14:15

@ Roxy'Pro Измените регион / культуру?

Maarten Bodewes 12.05.2019 22:32

@MaartenBodewes Я думал, что есть соответствующая буква, например "N1", "F1" или что-то в этом роде =) Но культура смены определенно сработает ..

Roxy'Pro 13.05.2019 00:59

просто так:

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

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

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

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

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

вау, это действительно аккуратно и чисто, не знал, что в C# есть это, спасибо!

coster128 13.06.2020 04:16

Другие вопросы по теме