Comment formater un c # décimal pour supprimer les 0 supplémentaires?

je veux formater une chaîne en tant que décimale, mais la décimale contient quelques zéros suivants après la décimale. Comment puis-je le formater pour que ces 0 vides de sens disparaissent?

string.Format("{0}", 1100M);
string.Format("{0}", 1100.1M);
string.Format("{0}", 1100.100M);
string.Format("{0}", 1100.1000M);

affiche:

1100
1100.1
1100.100
1100.1000

mais je veux que ce soit:

1100
1100.1
1100.1
1100.1

pour référence, voici d'autres questions qui sont essentiellement des duplicata de ceci, que j'ai trouvé grâce aux réponses données ici:

  • Analyser les décimales et filtre supplémentaire 0 sur la droite?
  • meilleure façon d'afficher les décimales sans les zéros de queue
  • Comment puis-je enlever des zéros et des points décimaux des chaînes décimales?
44
demandé sur Community 2011-01-24 23:18:33

11 réponses

Vous pouvez utiliser ToString() avec la Général ("G") Spécificateur de Format pour obtenir le résultat souhaité. Les zéros de queue sont tronqués lorsqu'on utilise cette chaîne de format avec une précision spécifiée. Afin d'éviter l'arrondissement dans toutes les situations, vous devrez régler la précision au maximum permis pour les décimales (29).

la ligne de code pour produire ce que vous voulez est number.ToString("G29") , où number est votre original décimal.

sachez que tout nombre inférieur à 0,0001 sera converti en notation scientifique. Plus de détails sur le fonctionnement de ce formatteur peuvent être trouvés sur le lien de référence ci-dessus.

78
répondu Herohtar 2014-04-07 20:07:04
string s = d.ToString("0.#############################");
20
répondu Jason dinAlt 2011-04-06 11:52:21

ils ne sont pas nécessairement dénués de sens - ils indiquent la précision pendant le calcul. Les décimales maintiennent leur niveau de précision, plutôt que d'être normalisées.

j'ai un code dans cette réponse qui va retourner une valeur normalisée - vous pouvez utiliser cela, puis formater le résultat. Par exemple:

using System;
using System.Numerics;

class Test
{
    static void Display(decimal d)
    {
        d = d.Normalize(); // Using extension method from other post
        Console.WriteLine(d);
    }

    static void Main(string[] args)
    {
        Display(123.4567890000m); // Prints 123.456789
        Display(123.100m);        // Prints 123.1
        Display(123.000m);        // Prints 123
        Display(123.4567891234m); // Prints 123.4567891234
    }
}

je suspect que la plupart de la chaîne de format approches échouent. Je voudrais devinez qu'une chaîne de format de "0."et puis 28 caractères#, mais il serait très laid...

4
répondu Jon Skeet 2017-05-23 10:31:07

vous pouvez spécifier la chaîne de format comme ceci:

String.Format("{0:0.000}", x);
3
répondu driis 2011-01-24 20:21:02

Que Diriez-vous de:

string FormatDecimal(decimal d)
{
    const char point = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0];
    string s = d.ToString();
    // if there's no decimal point, there's nothing to trim
    if (!s.Contains(point) == -1)
        return s;
    // trim any trailing 0s, followed by the decimal point if necessary
    return s.TrimEnd('0').TrimEnd(point);
}
3
répondu Gabe 2011-01-24 21:29:32

contrairement à ce que tout le monde suggère d'utiliser un spécificateur de format G , je suggère ce qui suit pour préserver à la fois le séparateur de milliers et le point décimal tout en supprimant les zéros supplémentaires:

{0:#,#.##}

le résultat de ce format est bien meilleur que G dans la plupart des cas:

String.Format("{0:#,#.##}",25/2.4);
10.42

String.Format("{0:#,#.##}",1000000);
1,000,000

String.Format("{0:#,#.##}",1000000.3600000);
1,000,000.36

et le spécificateur G ne peuvent pas gérer toutes les combinaisons possibles:

String.Format("{0:G29}",25/2.4);
10.416666666666668

String.Format("{0:G2}",25/2.4);
10

String.Format("{0:G29}",1000000.3600000);
1000000.36

String.Format("{0:G2}",1000000.3600000);
1E+06
3
répondu Mohsen Afshin 2015-04-30 07:16:06

plusieurs réponses déjà. Je me réfère souvent à cette feuille de tricherie: http://blog.stevex.net/string-formatting-in-csharp/

2
répondu Baz Hughes 2011-01-24 20:25:00

un peu hackish, mais cela devrait fonctionner:

decimal a = 100.00M;
string strNumber = string.Format("{0}", a);
Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber);
2
répondu Davy8 2011-01-24 20:37:08

je crois que vous voulez faire:

var s = String.Format("{0:#####.###}");
1
répondu AlG 2011-01-24 20:23:01
String.Format("{0:0.##}", 123.0); // "123"
1
répondu John K. 2012-12-20 10:50:57
double a = 1100.00
double  b =1100.1
double  c = 1100.100
double  d =1100.1000

Remove last zero after point


string stra = a.toString("0.00").TrimEnd('0').TrimEnd('.');
string strb = b.toString("0.00").TrimEnd('0').TrimEnd('.');
string strc = c.toString("0.00").TrimEnd('0').TrimEnd('.');
string strd = d.toString("0.00").TrimEnd('0').TrimEnd('.');

Output

1100
1100.1
1100.1
1100.1
-2
répondu Rakesh Solanki 2013-12-11 14:16:42