.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.