Question Comment arrondir une valeur décimale à 2 décimales (pour la sortie sur une page)


Lors de l'affichage de la valeur d'une décimale avec .ToString(), il est précis d'aimer 15 décimales, et puisque je l'utilise pour représenter les dollars et les cents, je veux seulement que la sortie soit de 2 décimales.

Est-ce que j'utilise une variation de .ToString() pour ça?


521
2017-10-02 22:41


origine


Réponses:


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

ou

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

731
2017-10-02 22:43



Je sais que c'est une vieille question, mais j'ai été surpris de voir que personne ne semblait répondre à cette question;

  1. N'a pas utilisé les banquiers en arrondissant
  2. N'a pas gardé la valeur sous forme décimale.

C'est ce que j'utiliserais:

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

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


508
2018-04-20 01:16



decimalVar.ToString("F");

Cette volonté:

  • Arrondir à 2 décimales, par ex. 23,456 => 23,46
  • Assurez-vous qu'il y a sont toujours 2 décimales, par exemple. 23 => 23,00, 12,5 => 12,50

Idéal pour la monnaie et l'affichage des montants monétaires.

Pour la documentation sur ToString ("F"): http://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx#FFormatString (avec merci à Jon Schneider)


274
2017-12-15 14:29



Si vous avez juste besoin de cela pour l'affichage, utilisez la chaîne.Format

String.Format("{0:0.00}", 123.4567m);      // "123.46"

http://www.csharp-examples.net/string-format-double/

Le "m" est un suffixe décimal. A propos du suffixe décimal:

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


92
2017-10-02 22:43



Donné décimal d = 12,345; les expressions d.ToString ("C") ou String.Format ("{0: C}", d) rendement 12,35 $ - Notez que les paramètres de devise de la culture actuelle, y compris le symbole, sont utilisés.

Notez que "C" utilise le nombre de chiffres de la culture actuelle. Vous pouvez toujours remplacer la valeur par défaut pour forcer la précision nécessaire avec C{Precision specifier} comme String.Format("{0:C2}", 5.123d).


53
2017-10-02 22:58



Si vous le souhaitez formaté avec des virgules ainsi qu'un point décimal (mais pas de symbole monétaire), comme 3 456 789.12 ...

decimalVar.ToString("n2");

40
2018-04-21 23:20



Il y a déjà deux bonnes réponses qui se réfèrent à Decimal.Round (...) mais je pense qu'un peu plus d'explications sont nécessaires - parce qu'il y a une propriété importante inattendue de Decimal qui n'est pas évidente.

Un nombre décimal "sait" combien de décimales il a basé sur d'où il vient.

Par exemple, les éléments suivants peuvent être inattendus:

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"

Faire les mêmes opérations avec Double ne donnera aucune décimale ("25") pour chacun des éléments ci-dessus.

Quand vous voulez une décimale à 2 décimales, il y a environ 95% de chance que ce soit parce que c'est la monnaie, auquel cas c'est probablement bien pour 95% du temps:

Decimal.Parse("25.0").ToString("c")     =>   "$25.00"

Ou en XAML vous utilisez simplement {Binding Price, StringFormat=c}

Un cas que j'ai rencontré où j'avais besoin d'une décimale AS était une décimale lors de l'envoi de XML au service Web d'Amazon. Le service se plaignait parce qu'une valeur Decimal (à l'origine de SQL Server) était envoyée en tant que 25.1200 et rejeté, (25.12 était le format attendu).

Tout ce que j'avais besoin de faire était Decimal.Round(...) avec 2 décimales pour résoudre le problème.

 // This is an XML message - with generated code by XSD.exe
 StandardPrice = new OverrideCurrencyAmount()
 {
       TypedValue = Decimal.Round(product.StandardPrice, 2),
       currency = "USD"
 }

TypedValue est de type Decimal donc je ne pouvais pas faire juste ToString("N2") et avait besoin de l'arrondir et de le garder comme decimal.


26
2017-10-26 07:30



Voici un petit programme Linqpad pour montrer différents formats:

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

Voici les résultats:

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
2017-11-18 20:44



Méthode Math.Round (Decimal, Int32)


14
2017-10-02 22:44