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()?

Author: Cody Gray, 2008-10-03

15 answers

decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0

Lub

decimalVar.ToString ("0.##"); // returns "0"  when decimalVar == 0
 751
Author: albertein,
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;

  1. nie używałem zaokrąglania bankierów
  2. nie zachował wartości dziesiętnej.

Tego bym użył:

decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);

Http://msdn.microsoft.com/en-us/library/9s0xa85y.aspx

 522
Author: Mike M.,
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)

 282
Author: Sofox,
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:

Http://msdn.microsoft.com/en-us/library/364x0z75.aspx

 94
Author: Jorge Ferreira,
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).

 53
Author: Hafthor,
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");
 40
Author: Joel Mueller,
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.

 26
Author: Simon_Weaver,
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
===================
 18
Author: What Would Be Cool,
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
 14
Author: John Smith,
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"
 9
Author: Kaido,
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

 7
Author: Smitha Poluri,
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"));
}
 7
Author: Alex,
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.

 5
Author: goamn,
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 "

 4
Author: Jeff Jose,
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);
}
 4
Author: HockeyJ,
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