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

852

Chcę dodać przecinek w tysiącach miejsc dla liczby.

String.Format()?

Seibar
źródło

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
Seibar
źródło
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")
alchemiczny
źródło
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
p.campbell
źródło
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.

prabir
źródło
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
CoderTao
źródło
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
Dennis
źródło
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.

Stephen Wrighton
źródło
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 .

von v.
źródło
29

tak proste jak to:

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

więcej informacji znajduje się tutaj

a_m_dev
źródło
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”

Ravi Desai
źródło
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”

Yitzhak Weinberg
źródło
ł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));
p.campbell
źródło
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}"; 
brakeroo
źródło
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

cmujica
źródło
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.


źródło
5
String.Format("0,###.###"); also works with decimal places
Abolfazl Rastgou
źródło
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}";
Mark Żukowski
źródło
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.

Dunwan
źródło
-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);
}
8 John Volante
źródło
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

Anirudh
źródło
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
Ali
źródło