




String.Format("{0:n}", 1234); // Output: 1,234.00
String.Format("{0:n0}", 9876); // No digits after the decimal point. Output: 9,876
@Justin: Согласно msdn.microsoft.com/en-us/library/0c899ak8.aspx, ',' (и '.') Заменяются правильными локализованными символами.
Коротко и легко читается, но целое число помещается в рамку при передаче в качестве аргумента. Я предпочитаю ответ @alchemical.
Если вы хотите, чтобы на вашей странице был десятичный формат, отличный от формата, определенного системой, вы можете изменить 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;
для меня он не работает, используя "{0:n0}", все еще дает мне 2.40
@VVVV - тогда вы, вероятно, передаете нить вместо номер. Если у вас есть строка, вам нужно сначала преобразовать ее в float или double. Попробуйте string.Format("{0:n0}", Double.Parse(yourValue));
Чтобы воспроизвести поведение спецификатора n, но с таким количеством десятичных цифр, которые присутствуют в самом числе, мне пришлось использовать эту строку формата вместо #,##0.## (из другого ответа здесь)
строковая интерполяция еще короче сокращенно $"{myVariable:n0}"
String.Format("{0:#,###,###.##}", MyNumber)
Это даст вам запятые в соответствующих точках.
Метод ": n" лучше, так как он должен учитывать языковой стандарт пользователя.
Это верно, но не гарантируется, что вы получите запятую в точке тысячи, потому что это уважает языковой стандарт пользователя.
прямо к вам: это правда, но не гарантируется соблюдение языкового стандарта пользователя, потому что он использует запятые в качестве разделителя тысяч. (Например, в Португалии десятичным разделителем является запятая.)
Если вы хотите применить значения после. вам нужно заменить # на 0. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx: Ноль заменяет ноль соответствующей цифрой, если она присутствует; в противном случае в строке результата появляется ноль, тогда как символ «#» заменяется соответствующей цифрой, если она присутствует; в противном случае в строке результата не появится цифра.
этот метод работал нормально для моих требований, страница msdn о методе Int32.ToString, который будет основным местом, где он будет использоваться msdn.microsoft.com/en-us/library/8wch342y.aspx, также не очень полезен для этого конкретного приложения.
единственная рекомендация - строка с большой буквы S, это соглашение ... результат такой же ... но String.format ("{0: #, ###, ###. ##}", MyNumber)
Когда MyNumber равен 0, возвращает пустую строку вместо «0».
Обратите внимание, что форматируемое значение должно быть числовым. Не похоже, что это будет строковое представление числа, а формат будет с запятыми.
int number = 1000000000;
string whatYouWant = number.ToString("#,##0");
//You get: 1,000,000,000
Это решение не подходит с точки зрения интернационализации - в других культурах в качестве разделителя тысяч используются символы, отличные от ,, например пробел или даже ..
Работает спасибо +1. Растянули так показывает до 2 д.п. number.ToString ("#, ## 0. ##")
@Justin Это правда, но иногда требования глупы, а требования - это требования. :) Однако, как вы отметили, метод Terrapin был бы лучше, учитывая достаточную гибкость.
@MacSigler На самом деле это неправда, см. Комментарий Роджера Липскомба к ответу выше: String.Format автоматически применит локализацию.
@Dan Я имел в виду, что это наиболее лаконичный способ, учитывая требование о том, что запятая всегда должна быть распечатана, будь то на американском, британском или китайском компьютере. «1.000.000.000» было бы неверным, потому что (по общему признанию, глупые, но не редкость) требования требуют запятых. Я полагаю, вы могли бы пройти и сделать специальную локализацию, но это было бы излишним.
@MacSigler В том-то и дело, что этот код невсегда распечатывает запятую. Только когда культура ожидает запятые (например, en-US или инвариант). Если культура предполагает другой разделитель (например, .), .NET автоматически заменит запятую этим разделителем. Опять же, я призываю вас прочитать ссылку, опубликованную Роджером, если вы все еще не понимаете, почему это так.
@Dan Итак, я пошел дальше и уже прочитал ссылку. Похоже, он уже учитывает культуру, а это означает, что комментарий Джастина будет неверным (если только не требуется специально выводить результат, чуждый культуре пользователя)? В любом случае, +1 за указание на кое-что о .NET, которого я не знал раньше, и за терпение в отношении моего упрямого невежества. :)
Комментарий @MacSigler Джастина по-прежнему верен в том смысле, что если вы явно не принудительно не принудительно установите язык и региональные параметры en-US, он унаследует параметры культуры с локального компьютера. Насколько я понимаю, компиляция приведенного выше кода, а затем его запуск на двух машинах с разными культурами (с разными разделителями чисел) приведет к разным результатам. Если вы хотите, чтобы всегда создавал запятую, вам необходимо явно установить язык и региональные параметры, использующие запятую (например, инвариант).
int num = 98765432;
Console.WriteLine(string.Format("{0:#,#}", num));
Или Console.WriteLine ("{0: #, #}", num); если вы просто хотите его распечатать. Но я думаю, string.Format (...) более полезен.
Я обнаружил, что это самый простой способ:
myInteger.ToString("N0")
Вы также можете использовать его с string.Format, например string.Format ("Вот какое-то число с запятыми, без десятичных знаков, {0: N0}", 123456789 (;
Разве это не должно быть myInteger.ToString ("N0") ... string.tostring, я не думаю, что это сработает.
Я знаю, что прошло уже 5 лет, но спасибо! Он работает для чисел> 4 символов и <4 символов.
@AskYous - Ну, это также работает для 4 символов .. Можно также сказать, что это работает для любой длины.
Это работает, но меняется в региональных настройках
Похоже, НЕТ.
myInteger.ToString ("N2"), если вы хотите 2 десятичных знака, т.е. 1 234 567,89 долларов США
Если вам нужна конкретная культура, вы можете попробовать следующее:
(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", чтобы скрыть десятичную дробь)
Метод, который я использовал, чтобы больше не беспокоиться о культурах и потенциальных проблемах форматирования, заключается в том, что я отформатировал его как валюту, а затем вынул символ валюты.
if (decimal.TryParse(tblCell, out result))
{
formattedValue = result.ToString("C").Substring(1);
}
Этот код не зависит от культуры - он будет использовать любую культуру по умолчанию, установленную на машине, на которой выполняется код. Это может привести к нежелательному результату, когда эта культура помещает свои символы валюты в конец числа, а не в начало (например, fr-FR), или использует более одного символа для обозначения валюты (например, da-DK), или не разделяет тысячи запятыми ( например, большая часть континентальной Европы).
Например String.Format("{0:0,0}", 1); возвращает 01, для меня не действует
Это работает для меня
19950000.ToString("#,#", CultureInfo.InvariantCulture));
выход 19 950 000
но если мы возьмем значение 19950000 в переменную и сделаем так var test = "19950000"; test.ToString ("#, #", CultureInfo.InvariantCulture)); это не работает
Стандартные форматы с соответствующими выводами,
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 в строковом формате.
Если вы хотите принудительно установить разделитель «,» независимо от языка и региональных параметров (например, в трассировке или в сообщении журнала), следующий код будет работать и имеет дополнительное преимущество, сообщая следующему парню, который наткнется на него, именно то, что вы делаете.
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 ??
правильно ли он определен, действительно ли он будет использоваться при получении экземпляра валюты, например: NumberFormat fmt = NumberFormat.getCurrencyInstance (locale); поправил код, спасибо!
Вы проверили теги? Речь идет о C#, а не о Java!
Если вы хотите отобразить его в 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
Что, если мне нужны точки в качестве разделителя тысяч и запятая в качестве десятичного разделителя?
проголосовали за, потому что он отображает не 12314.0 (как формат n1), а 12314 :)
Ответ, получивший наибольшее количество голосов, был отличным и был полезен около 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 Измените регион / культуру?
@MaartenBodewes Я думал, что есть соответствующая буква, например "N1", "F1" или что-то в этом роде =) Но культура смены определенно сработает ..
просто так:
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# есть это, спасибо!
Как я могу воспроизвести спецификатор «N», но с таким количеством десятичных цифр, которое присутствует в числе?