Строка .NET.Формат() для добавления запятых в тысячах мест для числа

#c# #.net #string #format

Вопрос:

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

Был String.Format() бы правильный путь? Какой формат я бы использовал?

Ответ №1:

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

Комментарии:

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

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

3. Если вы хотите принудительно ввести десятичный формат на своей странице, отличный от системного формата, вы можете изменить 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;

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

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

Ответ №2:

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

 myInteger.ToString("N0")
 

Комментарии:

1. Вы также можете использовать его со строкой. Формат, как в строке. Формат(«Вот некоторое число с запятыми и без десятичных знаков, {0:N0}», 123456789(;

2. разве это не должен быть мой помощник? toString(«N0») … строка.tostring, я не думаю, что это сработает.

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

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

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

Ответ №3:

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

Комментарии:

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

2. Работает, спасибо 1. Продлили, так что отображается до 2 д. п. номера. Струна(«#,##0.##»)

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

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

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

Ответ №4:

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

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

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

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

Комментарии:

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

Ответ №5:

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

 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
 

Комментарии:

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

Ответ №6:

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

 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. Что делать, если мне нужны точки в качестве разделителя тысяч и запятая в качестве десятичного разделителя?

2. голосовали, потому что он отображает не 12 314,0 (как формат n1), а 12 314 🙂

Ответ №7:

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

Ответ №8:

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

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

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

Ответ №9:

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

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

Комментарии:

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

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

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

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

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

Ответ №10:

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

 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»

Комментарии:

1. хороший ответ,но как насчет 29.255, 00 ?

2. @Roxy’Pro Изменил язык / культуру?

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

Ответ №11:

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

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

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

Ответ №12:

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

 var jackpot = 1_000_000; // underscore separators in numeric literals also available since C# 7.0
var niceNumberString = $"Jackpot is {jackpot:n}";
var niceMoneyString = $"Jackpot is {jackpot:C}";
 

Комментарии:

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

2. На самом деле это/было 7.0, см.: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…

Ответ №13:

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

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

или с помощью вашего вариабельного

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

Ответ №14:

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

Комментарии:

1. Или Утешить. Линия записи(«{0:#,#}»,num); если вы просто хотите распечатать его. Но струна. Формат (…), я думаю, более полезен.

Ответ №15:

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

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

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

выход
19,950,000

Комментарии:

1. но если мы возьмем значение 19950000 в переменную и сделаем так, как этот тест var = «19950000»; тест. toString(«#,#», CultureInfo. Инвариантная культура)); ее не будят

Ответ №16:

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

Ответ №17:

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

Ответ №18:

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

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

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

Ответ №19:

Вы хотите, чтобы значение формата было одинаковым и зависело от культуры.

  Double value= 1234567;
 value.ToString("#,#.##", CultureInfo.CreateSpecificCulture("hi-IN"));
 

Выход: 12,34,567

Комментарии:

1. Это очень специфично для культуры Индии, было бы лучше использовать более общий ответ.

Ответ №20:

Я попробовал многие из приведенных выше предложений, но приведенные ниже работают для меня лучше:

 string.Format("{0:##,###.00}", myValue)
 

но это не удается, когда у вас есть значения, такие как 0.2014, где это дает .21 Для этого я использую

 string.Format("{0:#,##0.00}", myValue)
 

Ответ №21:

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

 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
 

Ответ №22:

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

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

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

Комментарии:

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