Jak wyświetlić wartość dziesiętną do 2 miejsc po przecinku?

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: Liam, 2008-10-02

17 answers

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

Lub

decimalVar.ToString ("0.##"); // returns "0"  when decimalVar == 0
 954
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

 614
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ąglenie do 2 miejsc po przecinku np. 23.45623.46
  • Upewnij się, że tam są zawsze 2 miejsca po przecinku np. 2323.00; 12.512.50

Idealny do wyświetlania waluty.

Sprawdź dokumentację na ToString("F") (podziękowania dla Jona Schneidera).

 380
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
2020-04-28 11:16:07

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

 108
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).

 57
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");
 50
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

Jest bardzo ważna cecha Decimal, która nie jest oczywista:

A Decimal 'wie' ile miejsc po przecinku ma na podstawie skąd pochodzi

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 spowoduje zero miejsc po przecinku ("25") dla wszystkich powyższych przykładów.

Jeśli chcesz dziesiętne do 2 miejsc po przecinku, to jest bardzo prawdopodobne, ż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 użyłbyś {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).

Wszystko, co musiałem zrobić, to Decimal.Round(...) z 2 miejscami po przecinku, aby rozwiązać problem niezależnie od źródła wartości.

 // 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.

 32
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
2021-01-28 18:57:32

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
===================
 21
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
 16
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

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.

 12
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

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);
}
 11
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

Ż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

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"));
}
 9
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

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

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
Double Amount = 0;
string amount;
amount=string.Format("{0:F2}", Decimal.Parse(Amount.ToString()));
 2
Author: Code,
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
2019-08-20 06:54:00

Jeśli trzeba zachować tylko 2 miejsca po przecinku (tzn. odciąć wszystkie pozostałe cyfry po przecinku):

decimal val = 3.14789m;
decimal result = Math.Floor(val * 100) / 100; // result = 3.14

Jeśli trzeba zachować tylko 3 miejsca po przecinku:

decimal val = 3.14789m;
decimal result = Math.Floor(val * 1000) / 1000; // result = 3.147
 1
Author: Aleksei Mialkin,
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
2020-03-13 11:39:06