web-dev-qa-db-fra.com

Comment formater une décimale C # pour supprimer les 0 supplémentaires suivants?

Je veux formater une chaîne sous forme décimale, mais la décimale contient des zéros suivants après la décimale. Comment le formater de telle sorte que ces 0 sans signification 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 doublons de cela, que j'ai trouvées grâce aux réponses données ici:

46
Scott Stafford

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

La ligne de code pour produire ce que vous voulez est number.ToString("G29"), où number est votre décimale d'origine.

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

80
Herohtar
string s = d.ToString("0.#############################");
21
Jason dinAlt

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

J'ai du code dans cette réponse qui renverra une valeur normalisée - vous pouvez l'utiliser, 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 soupçonne que la plupart des approches de format de chaîne échoueront. Je suppose qu'une chaîne de format de "0". puis 28 # caractères fonctionneraient, mais ce serait très moche ...

4
Jon Skeet

Que diriez-vous:

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
Gabe

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

String.Format("{0:0.000}", x);
3
driis

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 de fin 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 peut pas vraiment 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
Mohsen Afshin

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

2
Baz Hughes

Un peu piraté, mais cela devrait fonctionner:

decimal a = 100.00M;
string strNumber = string.Format("{0}", a);
Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber);
2
Davy8
String.Format("{0:0.##}", 123.0); // "123"
1
John K.

Je crois que tu veux faire:

var s = String.Format("{0:#####.###}");
1
AlG