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?
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.
string s = d.ToString("0.#############################");
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...
vous pouvez spécifier la chaîne de format comme ceci:
String.Format("{0:0.000}", x);
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);
}
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
plusieurs réponses déjà. Je me réfère souvent à cette feuille de tricherie: http://blog.stevex.net/string-formatting-in-csharp/
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);
je crois que vous voulez faire:
var s = String.Format("{0:#####.###}");
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