Odpowiedzi:
decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0
lub
decimalVar.ToString ("0.##"); // returns "0" when decimalVar == 0
Decimal
i Double
type ToString
przyjmuje argument do formatowania. Najpierw spróbuj przekonwertować swoją wartość na dziesiętną / podwójną.
Wiem, że to stare pytanie, ale zdziwiłem się, widząc, że nikt nie wydaje odpowiedzi na to pytanie;
Chciałbym użyć tego:
decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);
decimalVar.ToString("F");
Spowoduje to:
23.456
→23.46
23
→ 23.00
; 12.5
→12.50
Idealny do wyświetlania waluty.
Sprawdź dokumentację ToString („F”) (podziękowania dla Jona Schneidera).
.
można je zastąpić ,
na podstawie kultury. Powinieneś przekazać CultureInfo.InvariantCulture
jako drugi argument, aby to wyłączyć.
Jeśli potrzebujesz tego tylko do wyświetlania, użyj string.Format
String.Format("{0:0.00}", 123.4567m); // "123.46"
http://www.csharp-examples.net/string-format-double/
„M” jest przyrostkiem dziesiętnym. Informacje o sufiksie dziesiętnym:
Biorąc pod uwagę dziesiętne d = 12,345; wyrażenia d.ToString („C”) lub String.Format („{0: C}”, d) dają 12,35 USD - zwróć uwagę, że używane są ustawienia waluty bieżącej kultury, w tym symbol.
Zauważ, że „C” używa liczby cyfr z bieżącej kultury. Zawsze można przesłonić domyślne wymusić niezbędną precyzję z C{Precision specifier}
niczym String.Format("{0:C2}", 5.123d)
.
Jeśli chcesz go sformatować przecinkami, a także kropką dziesiętną (ale bez symbolu waluty), na przykład 3 456 789,12 ...
decimalVar.ToString("n2");
Istnieją już dwie wysoko punktowane odpowiedzi, które odnoszą się do Decimal.Round (...), ale myślę, że potrzebne jest trochę więcej wyjaśnień - ponieważ istnieje nieoczekiwana ważna właściwość Decimal, która nie jest oczywista.
Po przecinku „wie”, ile miejsc po przecinku ma na podstawie tego, skąd pochodzi.
Na przykład mogą być nieoczekiwane:
Decimal.Parse("25").ToString() => "25"
Decimal.Parse("25.").ToString() => "25"
Decimal.Parse("25.0").ToString() => "25.0"
Decimal.Parse("25.0000").ToString() => "25.0000"
25m.ToString() => "25"
25.000m.ToString() => "25.000"
Wykonanie tych samych operacji z Double
nie da miejsc dziesiętnych ( "25"
) dla każdego z powyższych.
Jeśli chcesz od miejsc po przecinku do 2 miejsc po przecinku, masz około 95% szansy, ponieważ jest to waluta, w którym to przypadku jest to prawdopodobnie w porządku przez 95% czasu:
Decimal.Parse("25.0").ToString("c") => "$25.00"
Lub w XAML, którego właśnie używasz {Binding Price, StringFormat=c}
Jeden przypadek, w którym natrafiłem na miejsce dziesiętne jako dziesiętne, dotyczył wysyłania XML do serwisu Amazon. Usługa narzekała, ponieważ wartość dziesiętna (pierwotnie z SQL Server) była wysyłana jako 25.1200
odrzucana ( 25.12
oczekiwany format).
Wszystko, co musiałem zrobić, to Decimal.Round(...)
2 miejsca po przecinku, aby rozwiązać problem.
// This is an XML message - with generated code by XSD.exe
StandardPrice = new OverrideCurrencyAmount()
{
TypedValue = Decimal.Round(product.StandardPrice, 2),
currency = "USD"
}
TypedValue
jest typu, Decimal
więc nie mogłem tego zrobić ToString("N2")
i musiałem go zaokrąglić i zachować jako decimal
.
Oto mały program Linqpad do wyświetlania różnych formatów:
void Main()
{
FormatDecimal(2345.94742M);
FormatDecimal(43M);
FormatDecimal(0M);
FormatDecimal(0.007M);
}
public void FormatDecimal(decimal val)
{
Console.WriteLine("ToString: {0}", val);
Console.WriteLine("c: {0:c}", val);
Console.WriteLine("0.00: {0:0.00}", val);
Console.WriteLine("0.##: {0:0.##}", val);
Console.WriteLine("===================");
}
Oto wyniki:
ToString: 2345.94742
c: $2,345.95
0.00: 2345.95
0.##: 2345.95
===================
ToString: 43
c: $43.00
0.00: 43.00
0.##: 43
===================
ToString: 0
c: $0.00
0.00: 0.00
0.##: 0
===================
ToString: 0.007
c: $0.01
0.00: 0.01
0.##: 0.01
===================
Bardzo rzadko chciałbyś mieć pusty ciąg, jeśli wartość wynosi 0.
decimal test = 5.00;
test.ToString("0.00"); //"5.00"
decimal? test2 = 5.05;
test2.ToString("0.00"); //"5.05"
decimal? test3 = 0;
test3.ToString("0.00"); //"0.00"
Najwyżej oceniana odpowiedź jest niepoprawna i zmarnowała 10 minut czasu (większości) ludzi.
"#"
oznacza cyfrę numeru (w razie potrzeby) (bez dopełnienia, jeśli nie jest potrzebna) "0"
oznacza cyfrę numeru (bez względu na to, co) (wypełnione zerami, jeśli nie są dostępne)
Odpowiedź Mike M. była idealna dla mnie na .NET, ale .NET Core nie ma decimal.Round
metody w chwili pisania.
W .NET Core musiałem użyć:
decimal roundedValue = Math.Round(rawNumber, 2, MidpointRounding.AwayFromZero);
Metoda hacky, w tym konwersja na ciąg znaków, to:
public string FormatTo2Dp(decimal myNumber)
{
// Use schoolboy rounding, not bankers.
myNumber = Math.Round(myNumber, 2, MidpointRounding.AwayFromZero);
return string.Format("{0:0.00}", myNumber);
}
Żadne z nich nie zrobiło dokładnie tego, czego potrzebowałem, aby wymusić 2 dp i zaokrąglić w górę jako0.005 -> 0.01
Wymuszenie 2 dp wymaga zwiększenia precyzji o 2 dp, aby upewnić się, że mamy co najmniej 2 dp
następnie zaokrąglanie, aby upewnić się, że nie mamy więcej niż 2 dp
Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)
6.665m.ToString() -> "6.67"
6.6m.ToString() -> "6.60"
Najwyżej oceniana odpowiedź opisuje metodę formatowania reprezentacji ciągu wartości dziesiętnej i działa.
Jeśli jednak chcesz zmienić zapisaną dokładność na rzeczywistą wartość, musisz napisać coś takiego:
public static class PrecisionHelper
{
public static decimal TwoDecimalPlaces(this decimal value)
{
// These first lines eliminate all digits past two places.
var timesHundred = (int) (value * 100);
var removeZeroes = timesHundred / 100m;
// In this implementation, I don't want to alter the underlying
// value. As such, if it needs greater precision to stay unaltered,
// I return it.
if (removeZeroes != value)
return value;
// Addition and subtraction can reliably change precision.
// For two decimal values A and B, (A + B) will have at least as
// many digits past the decimal point as A or B.
return removeZeroes + 0.01m - 0.01m;
}
}
Przykładowy test jednostkowy:
[Test]
public void PrecisionExampleUnitTest()
{
decimal a = 500m;
decimal b = 99.99m;
decimal c = 123.4m;
decimal d = 10101.1000000m;
decimal e = 908.7650m
Assert.That(a.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("500.00"));
Assert.That(b.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("99.99"));
Assert.That(c.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("123.40"));
Assert.That(d.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("10101.10"));
// In this particular implementation, values that can't be expressed in
// two decimal places are unaltered, so this remains as-is.
Assert.That(e.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("908.7650"));
}
Możesz użyć system.globalization, aby sformatować liczbę w dowolnym wymaganym formacie.
Na przykład:
system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");
Jeśli masz a decimal d = 1.2300000
i musisz przyciąć go do 2 miejsc po przecinku, możesz go wydrukować w ten sposób, d.Tostring("F2",ci);
gdzie F2 jest łańcuchem tworzącym do 2 miejsc po przecinku, a ci jest ustawieniem narodowym lub kulturą.
Aby uzyskać więcej informacji, sprawdź ten link
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
https://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx
Ten link szczegółowo wyjaśnia, jak poradzić sobie z problemem i co możesz zrobić, jeśli chcesz dowiedzieć się więcej. Dla uproszczenia chcesz to zrobić
double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");
jeśli chcesz tego dla waluty, możesz to ułatwić, wpisując „C2” zamiast „F2”
Double Amount = 0;
string amount;
amount=string.Format("{0:F2}", Decimal.Parse(Amount.ToString()));
Jeśli chcesz zachować tylko 2 miejsca po przecinku (tj. Odetnij wszystkie pozostałe cyfry po przecinku):
decimal val = 3.14789m;
decimal result = Math.Floor(val * 100) / 100; // result = 3.14
Jeśli chcesz zachować tylko 3 miejsca po przecinku:
decimal val = 3.14789m;
decimal result = Math.Floor(val * 1000) / 1000; // result = 3.147