.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

39
String.Format("{0:#,##0}", 1234);також працює без десяткових знаків.
Грег Брей

9
Як я можу копіювати специфікатор "N", але з такою кількістю десяткових цифр, які присутні в номері?
Стівен Дрю

56
@Justin: Відповідно до msdn.microsoft.com/en-us/library/0c899ak8.aspx , ',' (і '.') Замінюються правильними локалізованими символами.
Роджер Ліпскомб

@RogerLipscombe Я цього не зрозумів
Джастін

6
@VVVV - тоді ви, ймовірно, передаєте рядок замість числа . Якщо у вас є рядок, вам потрібно спочатку перетворити на плаваючу чи подвійну. Спробуйтеstring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve

378

Я вважав, що це найпростіший спосіб:

myInteger.ToString("N0")

1
Ви також можете використовувати його з string.Format, як у string.Format ("Ось деяка кількість з комами, а не десяткові знаки, {0: N0}", 123456789 (;
Dan Morphis

16
чи не повинен це бути мій Integer.ToString ("N0") ... string.tostring я не думаю, що буде працювати.
Тейлор Браун

1
Я знаю, що минуло вже 5 років, але дякую! Він працює для чисел> 4 символи та <4 символів.
Запитуйте

@AskYous - Добре, він також працює для 4 символів. Можна також сказати, що він працює на будь-яку довжину.
Broots Waymb

Це працює, але це змінюється в регіональних налаштуваннях
saulyasar

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

27
Це рішення не є корисним з точки зору інтернаціоналізації - інші культури використовують символи, окрім ,як розділювач тисяч, наприклад пробіл чи навіть ..
Джастін

6
Дякую + 1. Подовжили так показує до 2 dp.ToString ("#, ## 0. ##")
Crab Bucket

8
@MacSigler Насправді це неправда, дивіться коментар Роджера Ліпскомба до відповіді вище: String.Format локалізує локалізацію автоматично.
Дан Бешард

10
@MacSigler Це справа, однак цей код не завжди виводить кому. Тільки тоді, коли культура така, яка очікує коми (наприклад, en-US або інваріантна). Якщо культура така, яка очікує іншого роздільника (наприклад .), .NET автоматично замінить кому цим роздільником. Знову закликаю вас прочитати посилання, розміщене Роджером, якщо ви все ще не розумієте, чому це так.
Dan Bechard

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

Примітка. Деякі культури мають ,на увазі десяткові значення, а не .будьте обережні.


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 culture):

(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

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) не змінилося. Щоб отримати повну характеристику того, що нового, ви можете зайти на цю сторінку .


29

просто так:

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

Більше інформації тут


21

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

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

набори відформатовані до "19 400 350"


21

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

String.Format("{0:N1}", 29255.0);

Або

29255.0.ToString("N1")

результат "29255,0"

String.Format("{0:N2}", 29255.0);

Або

29255.0.ToString("N2")

результат "29255,00"


приємна відповідь, а як щодо 29.255,00?
Roxy'Pro

@ Roxy'Pro Змінити локаль / культуру?
Maarten Bodewes

@MaartenBodewes Я подумав, що є відповідна літера типу "N1", "F1" або щось подібне =) Але зміна культури спрацьовує точно ...
Roxy'Pro

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

3
Або Console.WriteLine ("{0: #, #}", число); якщо ви просто хочете роздрукувати його. Але здається, що string.Format (...) корисніший.
Indy9000

11

Простіше, використовуючи рядкову інтерполяцію замість String.Format

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

або використовуючи вашуVariable

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

9

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

Це працює для мене

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

вихід 19,950 000


8

Зауважте, що значення, яке ви форматуєте, має бути числовим. Це не схоже на те, що воно буде представляти рядкове число та формат із комами.



5

C # 7.1 (можливо, раніше?) Робить це таким же простим і приємним виглядом, як це має бути, із строповою інтерполяцією:

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

3

Ви можете використовувати таку функцію, як ця, для форматування чисел та необов'язково передавати в потрібних десяткових знаках. Якщо десяткових знаків не вказано, він буде використовувати два знаки після коми.

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

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


-2

Метод, який я раніше не переймався культурою та потенційними проблемами форматування, полягає в тому, що я відформатував його як валюту і потім вийняв символ валюти.

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

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

6
Цей код не залежить від культури - він використовуватиме будь-яку культуру за замовчуванням, встановлену на машині, на якій працює код. Це може створити небажаний вихід, коли ця культура розміщує свої символи валюти в кінці числа, а не на початку (наприклад fr-FR), або використовує більше одного символу для позначення валюти (наприклад da-DK), або не відокремлює тисячі за допомогою коми (наприклад, більшість материкової Європи).
захопився

-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");

ВИХІД: R.9999999,00

Естонська локальна продукція

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

ВИХІД: 9 999 999 €

Як ви бачите в різних результатах, вам не доведеться турбуватися про те, що роздільник є комою або крапкою або навіть пробілом, ви можете отримати номер, відформатований відповідно до стандартів i18n


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.