Jak zaokrąglić wartość dziesiętną do 2 miejsc po przecinku (dla wyjścia na stronie)
Podczas wyświetlania wartości dziesiętnej z .ToString()
, jest ona dokładna do 15 miejsc po przecinku, a ponieważ używam jej do reprezentowania dolarów i centów, chcę tylko, aby wynik był 2 miejsca po przecinku.
Czy używam do tego wariantu .ToString()
?
15 answers
decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0
Lub
decimalVar.ToString ("0.##"); // returns "0" when decimalVar == 0
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-09 21:20:09
Wiem, że to stare pytanie, ale zaskoczyło mnie, że nikt nie napisał na to odpowiedzi;
- nie używałem zaokrąglania bankierów
- nie zachował wartości dziesiętnej.
Tego bym użył:
decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-10 17:01:10
decimalVar.ToString("F");
To będzie:
- zaokrąglić do 2 miejsc po przecinku np. 23.456 => 23.46
- Upewnij się, że tam są zawsze 2 miejsca po przecinku np. 23 => 23.00, 12.5 => 12.50
Idealny dla waluty i wyświetlania kwot pieniężnych.
Dla dokumentacji ToString ("F"): http://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx#FFormatString (Dzięki Jon Schneider)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 08:48:46
Jeśli potrzebujesz tylko tego 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. O przyrostku dziesiętnym:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-10 11:35:49
Podane dziesiętne d=12.345; wyrażenia d.ToString("C") lub String.Format ("{0: C}", d) yield $12.35 - Należy pamiętać,że używane są ustawienia waluty bieżącej kultury, w tym symbol.
Zauważ, że "C" używa liczby cyfr z obecnej Kultury. Zawsze możesz przesłonić wartość domyślną, aby wymusić wymaganą precyzję za pomocą C{Precision specifier}
, np. String.Format("{0:C2}", 5.123d)
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-30 19:25:36
Jeśli chcesz sformatować go przecinkami, a także przecinkiem dziesiętnym( ale bez symbolu waluty), na przykład 3,456,789.12...
decimalVar.ToString("n2");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-21 23:20:35
Są już dwie wysoko punktowane odpowiedzi, które odnoszą się do dziesiętnych.Okrągłe(...), ale myślę, że potrzebne jest trochę więcej wyjaśnień-bo istnieje nieoczekiwana ważna właściwość dziesiętna, która nie jest oczywista.
Dziesiętny "wie" , ile miejsc po przecinku ma na podstawie tego, skąd pochodzi.
Na przykład następujące 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 miejsca po przecinku ("25"
) dla każdego z powyższych.
Kiedy chcesz dziesiętne do 2 miejsc po przecinku jest około 95% szans, to dlatego, że 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 wystarczy użyć {Binding Price, StringFormat=c}
Jeden przypadek, na który wpadłem, gdzie potrzebowałem dziesiętnego jako dziesiętnego, był podczas wysyłania XML do serwisu internetowego Amazon. Serwis narzekał, ponieważ wartość dziesiętna (pierwotnie z SQL Server) była wysyłana jako 25.1200
i odrzucana, (25.12
był oczekiwanym formatem).
All I needed to do było Decimal.Round(...)
z 2 miejscami 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 po prostu zrobić ToString("N2")
i musiałem go zaokrąglić i zachować jako decimal
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-26 07:30:22
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
===================
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-26 15:02:14
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 22:44:43
Żaden z nich nie zrobił dokładnie tego, czego potrzebowałem, aby wymusić 2 d. p. i zaokrąglić się jako 0.005 -> 0.01
Wymuszanie 2 d. p. wymaga zwiększenia precyzji o 2 d.P., aby mieć pewność, że mamy co najmniej 2 d. P.
Następnie zaokrąglenie, aby upewnić się, że nie mamy więcej niż 2 d.p.
Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)
6.665m.ToString() -> "6.67"
6.6m.ToString() -> "6.60"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-30 11:12:45
Możesz użyć systemu.globalizacja sformatować liczbę w dowolnym wymaganym formacie.
Na przykład:
system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");
Jeśli masz decimal d = 1.2300000
i musisz ją przyciąć do 2 miejsc po przecinku, to można ją wydrukować w ten sposób d.Tostring("F2",ci);
gdzie F2 jest formatem znaków do 2 miejsc po przecinku, a ci jest locale lub cultureinfo.
Aby uzyskać więcej informacji sprawdź ten link
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-30 11:24:55
Najlepiej oceniana odpowiedź opisuje metodę formatowania reprezentacji łańcuchowej wartości dziesiętnej i działa.
Jeśli jednak chcesz zmienić zapisaną dokładność na rzeczywistą wartość, musisz napisać coś w stylu:
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"));
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-24 15:23:36
Bardzo rzadko chcesz pusty łańcuch, 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"
Najlepiej oceniana odpowiedź jest nieprawidłowa i zmarnowała 10 minut (większości) czasu ludzi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-01 01:51:52
Https://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx
Ten link wyjaśnia szczegółowo, w jaki sposób możesz poradzić sobie z problemem i co możesz zrobić, jeśli chcesz dowiedzieć się więcej. Dla uproszczenia, co chcesz zrobić to
double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");
Jeśli chcesz to dla waluty, możesz to ułatwić, wpisując "C2" zamiast " F2 "
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-25 20:11:06
Odpowiedź Mike ' a M. była dla mnie idealna na. Net, ale. Net Core nie ma metody decimal.Round
w momencie pisania.
W. Net Core musiałem użyć:
decimal roundedValue = Math.Round(rawNumber, 2, MidpointRounding.AwayFromZero);
Metoda hacky, w tym konwersja na string, 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);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-21 10:31:07