.NET String.Format (), aby dodać przecinki w tysiącach miejsc dla liczby


Odpowiedzi:


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);działa również bez miejsc po przecinku.
Greg Bray,

9
Jak mogę zreplikować specyfikator „N”, ale z tyloma cyframi dziesiętnymi, ile jest obecnych w liczbie?
Stephen Drew

56
@Justin: Według msdn.microsoft.com/en-us/library/0c899ak8.aspx , „,” (i „.”) Są zastępowane poprawnymi zlokalizowanymi znakami.
Roger Lipscombe,

@RogerLipscombe Nie zdawałem sobie z tego sprawy
Justin

6
@VVVV - wtedy prawdopodobnie przekazujesz ciąg zamiast liczby . Jeśli masz ciąg, musisz najpierw przekonwertować na zmiennoprzecinkowe lub podwójne. Spróbujstring.Format("{0:n0}", Double.Parse(yourValue));
ToolmakerSteve

378

Odkryłem, że jest to najprostszy sposób:

myInteger.ToString("N0")

1
Można go również używać z ciągiem.Format, jak w ciągu string.Format („Oto pewna liczba z przecinkami i bez miejsc po przecinku, {0: N0}”, 123456789 (;
Dan Morphis

16
nie powinno to być myInteger.ToString ("N0") ... string.tostring Nie sądzę, żeby działało.
Taylor Brown

1
Wiem, że minęło już 5 lat, ale dzięki! Działa dla liczb> 4 znaków i <4 znaków.
AskYous

@AskYous - Cóż, działa również na 4 znaki. Może również powiedzieć, że działa na dowolną długość.
Broots Waymb

To działa, ale zmienia się w ustawieniach regionalnych
saulyasar

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

27
To rozwiązanie nie jest dobre z punktu widzenia internacjonalizacji - inne kultury używają znaków innych niż ,jako separator tysięcy, na przykład spacja lub nawet ..
Justin

6
Działa dzięki + 1. Mam rozszerzone, więc pokazuje do 2 numerów dp. ToString ("#, ## 0. ##")
Crab Bucket

8
@MacSigler W rzeczywistości to nieprawda, zobacz komentarz Rogera Lipscombe do powyższej odpowiedzi: String.Format automatycznie zastosuje lokalizację.
Dan Bechard

10
@MacSigler Tyle że ten kod nie zawsze drukuje przecinek. Tylko wtedy, gdy kultura oczekuje przecinków (np. En-US lub niezmiennik). Jeśli kultura oczekuje innej separacji (np. .), .NET automatycznie zastąpi przecinek tym separatorem. Ponownie zachęcam do przeczytania linku opublikowanego przez Rogera, jeśli nadal nie rozumiesz, dlaczego tak jest.
Dan Bechard

4
@MacSigler Komentarz Justina jest nadal poprawny, ponieważ jeśli nie wymusisz wyraźnie kultury na en-US, odziedziczy ustawienia kultury z lokalnego komputera. Rozumiem, że skompilowanie powyższego kodu, a następnie uruchomienie go na dwóch komputerach z różnymi kulturami (z różnymi separatorami liczb) dałoby różne wyniki. Jeśli chcesz, aby zawsze tworzył przecinek, musisz jawnie ustawić kulturę, która używa przecinka (np. Niezmiennik).
Dan Bechard

98

Jeśli chcesz specyficzne dla kultury, spróbuj tego:

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

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

Uwaga: niektóre kultury używają ,oznaczenia dziesiętnego, a nie .ostrożnego.


77

Standardowe formaty i powiązane z nimi dane wyjściowe,

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

Przykładowy wynik (kultura 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

2
Ta odpowiedź zawiera wiele przydatnych informacji. Ucząc się na przykładzie Widzę teraz, co oznaczają cyfry 0 i 1 w formacie ciągu.
user420667,

41

To najlepszy format. Działa we wszystkich tych przypadkach:

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
Co jeśli chcę kropki jako separator tysięcy, a przecinek jako separator dziesiętny?
FrenkyB

przegłosowano, ponieważ nie wyświetla 12 314,0 (jak format n1), ale 12 314 :)
NDUF

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

To da ci przecinki w odpowiednich punktach.


10
Metoda „: n” jest lepsza, ponieważ powinna uwzględniać ustawienia regionalne użytkownika.
Torlack,

12
To prawda, ale nie jest gwarantowane, aby podawać przecinki w tysiącach punktów, ponieważ respektują ustawienia regionalne użytkownika.
Stephen Wrighton,

2
od razu do ciebie: to prawda, ale nie ma gwarancji poszanowania ustawień regionalnych użytkownika, ponieważ używa przecinków jako separatora tysięcy. (Na przykład w Portugalii przecinek jest separatorem dziesiętnym).
ANeves

1
Jeśli chcesz wymusić wartości po. musisz zamienić # na 0. msdn.microsoft.com/en-us/library/0c899ak8(v=vs.110).aspx : Zero zastępuje zero odpowiednią cyfrą, jeśli jest obecna; w przeciwnym razie zero pojawi się w ciągu wynikowym, podczas gdy symbol „#” zostanie zastąpiony odpowiednią cyfrą, jeśli jest obecna; w przeciwnym razie w ciągu wynikowym nie pojawi się żadna cyfra.
Clarice Bouwer

ta metoda działała dobrze dla moich wymagań, strona msdn o metodzie Int32.ToString, która byłaby głównym miejscem, w którym byłaby używana msdn.microsoft.com/en-us/library/8wch342y.aspx nie jest bardzo pomocna w tym przypadku albo aplikacja
stackuser83

33

Najczęściej głosowana odpowiedź była świetna i była pomocna przez około 7 lat. Wraz z wprowadzeniem C # 6.0, a konkretnie interpolacji ciągów, jest łatwiejszy i, IMO bezpieczniejszy, sposób na zrobienie tego, o co poproszono 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

Gdzie zmienna i jest wstawiana w miejsce symbolu zastępczego (tj {0}.). Nie trzeba więc pamiętać, który obiekt trafia w którą pozycję. Formatowanie (tj. :n) Nie uległo zmianie. Aby uzyskać pełną funkcję tego, co nowego, możesz przejść do tej strony .


29

tak proste jak to:

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

więcej informacji znajduje się tutaj


21

Jeśli chcesz wymusić separator „,” bez względu na kulturę (na przykład w komunikacie śledzenia lub dziennika), poniższy kod będzie działał i ma dodatkową zaletę, mówiąc następnemu facetowi, który natknie się na niego dokładnie, co robisz.

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

zestawy sformatowane na „19 400 300”


21

Poniższy przykład wyświetla kilka wartości, które są sformatowane przy użyciu niestandardowych ciągów formatu, które zawierają zero symboli zastępczych.

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

Lub

29255.0.ToString("N1")

wynik „29 255,0”

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

Lub

29255.0.ToString("N2")

wynik „29 255,00”


ładna odpowiedź, ale co z 29.255,00?
Roxy'Pro

@ Roxy'Pro Zmienić lokalizację / kulturę?
Maarten Bodewes

@ MaartenBodewes Myślałem, że istnieje odpowiednia litera, taka jak „N1”, „F1” lub coś w tym stylu =) Ale kultura
śpiewania

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

3
Lub Console.WriteLine ("{0: #, #}", num); jeśli tylko chcesz to wydrukować. Ale string.Format (...) jest chyba bardziej przydatny.
Indy9000,

11

Prostsze, używając interpolacji ciągów zamiast String.Format

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

lub używając yourVariable

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

9

Na przykład String.Format("{0:0,0}", 1);zwraca 01, dla mnie nie jest poprawny

To działa dla mnie

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

produkcja 19 950 000


8

Pamiętaj, że formatowana wartość powinna być liczbowa. Nie wygląda na to, że zajmie ciąg reprezentujący liczbę, a format jest przecinkami.



5

C # 7.1 (może wcześniej?) Sprawia, że ​​jest to tak łatwe i ładne, jak powinno być, z interpolacją ciągów:

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

3

Możesz użyć takiej funkcji, aby sformatować liczby i opcjonalnie przekazać z żądanymi miejscami dziesiętnymi. Jeśli miejsca dziesiętne nie są określone, użyje dwóch miejsc dziesiętnych.

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

Używam dziesiętnych, ale możesz zmienić typ na dowolny inny lub użyć obiektu anonimowego. Możesz także dodać sprawdzanie błędów pod kątem ujemnych wartości miejsc dziesiętnych.


-2

Metodą, której nie martwiłem się już o kultury i potencjalne problemy z formatowaniem, jest to, że sformatowałem ją jako walutę, a następnie wyjąłem symbol waluty.

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

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

6
Ten kod nie jest niezależny od kultury - użyje dowolnej domyślnej kultury na komputerze z uruchomionym kodem. Może to powodować niepożądane rezultaty, w których kultura umieszcza symbole walut na końcu numeru zamiast na początku (np. fr-FR) Lub używa więcej niż jednego znaku do oznaczenia waluty (np. da-DK) Lub nie rozdziela tysięcy za pomocą przecinków (np. Większość Europy kontynentalnej).
porzucony

-2

Poniżej znajduje się dobre rozwiązanie w Javie!

NumberFormat fmt = NumberFormat.getCurrencyInstance();
System.out.println(fmt.format(n));

lub w celu uzyskania bardziej niezawodnego sposobu na uzyskanie lokalizacji danego miejsca, użyj poniższej instrukcji:

int n=9999999;
Locale locale = new Locale("en", "US");
NumberFormat fmt = NumberFormat.getCurrencyInstance(locale);
System.out.println(fmt.format(n));

WYDAJNOŚĆ US locale w USA : 9 999 999 USD

Dane wyjściowe w języku niemieckim

Locale locale = new Locale("de", "DE");

WYDAJNOŚĆ: 9.999.999,00 €

Dane wyjściowe ustawień regionalnych Indii

Locale locale = new Locale("de", "DE");

WYDAJNOŚĆ: Rs.9,999,999.00

Estońskie ustawienia regionalne

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

WYDAJNOŚĆ: 9 999 999 €

Jak widać na różnych wyjściach, nie musisz się martwić, że separator jest przecinkiem lub kropką, a nawet spacją , możesz sformatować liczbę zgodnie ze standardami i18n


1
gdzie locale użyłeś zmiennej ?
Smith

dobrze zauważony, czy rzeczywiście jest używany podczas pobierania wystąpienia waluty, np .: NumberFormat fmt = NumberFormat.getCurrencyInstance (ustawienia regionalne); poprawiłem kod, dzięki!
Anirudh,

3
Czy sprawdziłeś tagi? Pytanie dotyczy C # a nie Java!
Salar,

-3

Jeśli chcesz pokazać go w DataGridview, powinieneś zmienić jego typ, ponieważ domyślnie jest to String, a ponieważ zmienisz go na dziesiętny, uważa się go za Liczba z liczbą zmiennoprzecinkową

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.