Formatowanie liczby zmiennoprzecinkowej do 2 miejsc po przecinku


210

Obecnie buduję moduł sprzedaży dla witryny klienta. Do tej pory mam cenę do obliczenia idealnie, ale utknąłem w formatowaniu wyniku do 2 miejsc po przecinku.

Obecnie wywołuję to w zmiennej, dzięki czemu mogę powiązać wyniki z widokiem listy.

Sale = float.Parse(((x.Sale_Price - (x.Sale_Price * (x.Discount_Price / 100))).ToString())),

Czy ktoś może mi pokazać, jak sformatować wynik do 2 miejsc po przecinku? Wielkie dzięki!


Sprawdź to nie jestem pewien, ale może być to będzie działać ToString ("#. ##");
Syeda

Odpowiedzi:


467

Możesz przekazać format do ToStringmetody, np .:

myFloatVariable.ToString("0.00"); //2dp Number

myFloatVariable.ToString("n2"); // 2dp Number

myFloatVariable.ToString("c2"); // 2dp currency

Standardowe ciągi formatu liczb


38
„N2” i „C2” dodadzą tysiące separatorów, a „0,00” nie.
Marc K

5
Na wszelki wypadek (ja byłem) wszystkie te sposoby formatowania wartości zmiennoprzecinkowych zapewniają zaokrąglanie.
RenniePet,

46

Pierwszą rzeczą, którą musisz zrobić, to użyć tego decimaltypu zamiast floatcen. Używanie floatjest absolutnie niedopuszczalne, ponieważ nie może dokładnie reprezentować większości ułamków dziesiętnych.

Po wykonaniu tej czynności Decimal.Round()można użyć do zaokrąglenia do 2 miejsc.


36

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

Bardziej złożony przykład z formatowania ciągów w C # :

String.Format("{0:$#,##0.00;($#,##0.00);Zero}", value);

Spowoduje to wygenerowanie „1 240,00 $”, jeśli zostanie przekazane 1243,50. Wypisuje ten sam format, ale w nawiasach, jeśli liczba jest ujemna, i wyświetli ciąg „Zero”, jeśli liczba jest równa zero.



4
string outString= number.ToString("####0.00");

1
Istnieją różne „0” i „#” w niestandardowym formacie. „0”: Zastępuje zero odpowiednią cyfrą, jeśli jest obecna; w przeciwnym razie zero pojawi się w ciągu wynikowym. „#”: Zastępuje symbol „#” odpowiednią cyfrą, jeśli jest obecna; w przeciwnym razie w ciągu wynikowym nie pojawi się żadna cyfra. Odniesienie
瑲 瑲

3

Jak już wspomniano, będziesz musiał użyć sformatowanego wyniku; które jest wykonywane przez Write(), WriteLine(), Format()i ToString()metod.

To, co nie zostało wspomniane, to format stałoprzecinkowy, który dopuszcza określoną liczbę miejsc dziesiętnych. Używa „F”, a liczba po „F” jest liczbą wyrzuconych miejsc dziesiętnych, jak pokazano w przykładach.

Console.WriteLine("{0:F2}", 12);    // 12.00 - two decimal places
Console.WriteLine("{0:F0}", 12.3);  // 12 - ommiting fractions

2

Dotyczy to przypadków, w których chcesz użyć interpolowanych ciągów . Publikuję to, ponieważ mam dość prób i błędów i ostatecznie przewijam mnóstwo dokumentów za każdym razem, gdy muszę sformatować jakiś skalar.

$"{1234.5678:0.00}"        "1234.57"        2 decimal places, notice that value is rounded
$"{1234.5678,10:0.00}"     "   1234.57"     right-aligned
$"{1234.5678,-10:0.00}"    "1234.57   "     left-aligned
$"{1234.5678:0.#####}"     "1234.5678"      5 optional digits after the decimal point
$"{1234.5678:0.00000}"     "1234.56780"     5 forced digits AFTER the decimal point, notice the trailing zero
$"{1234.5678:00000.00}"    "01234.57"       5 forced digits BEFORE the decimal point, notice the leading zero
$"{1234.5612:0}"           "1235"           as integer, notice that value is rounded
$"{1234.5678:F2}"          "1234.57"        standard fixed-point
$"{1234.5678:F5}"          "1234.56780"     5 digits after the decimal point, notice the trailing zero
$"{1234.5678:g2}"          "1.2e+03"        standard general with 2 meaningful digits, notice "e"
$"{1234.5678:G2}"          "1.2E+03"        standard general with 2 meaningful digits, notice "E"
$"{1234.5678:G3}"          "1.23E+03"       standard general with 3 meaningful digits
$"{1234.5678:G5}"          "1234.6"         standard general with 5 meaningful digits
$"{1234.5678:e2}"          "1.23e+003"      standard exponential with 2 digits after the decimal point, notice "e"
$"{1234.5678:E3}"          "1.235E+003"     standard exponential with 3 digits after the decimal point, notice "E"
$"{1234.5678:N2}"          "1,234.57"       standard numeric, notice the comma
$"{1234.5678:C2}"          "$1,234.57"      standard currency, notice the dollar sign
$"{1234.5678:P2}"          "123,456.78 %"   standard percent, notice that value is multiplied by 100
$"{1234.5678:2}"           "2"              :)

Ostrzeżenie o wydajności

Interpolowane ciągi są powolne. Z mojego doświadczenia wynika, że ​​jest to kolejność (od szybkiego do wolnego):

  1. value.ToString(format)+" blah blah"
  2. string.Format("{0:format} blah blah", value)
  3. $"{value:format} blah blah"
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.