210 votes

Supprimer les zéros de fin?

J'ai des champs retournés par une collection comme

 2.4200
2.0044
2.0000
 

Je veux des résultats comme

 2.42
2.0044
2
 

J'ai essayé avec String.Format, mais il renvoie 2.0000 et le définit sur N0 arrondit également les autres valeurs.

Modifier:

Bien que je l'ai marqué comme réponse, mais en quelque sorte confus sur lequel choisir. Fasih a également donné une solution de contournement vraiment cool. Si les modérateurs savent ce qui est le plus approprié techniquement, ils peuvent le marquer.

246voto

Thomas Materna Points 1080

J'ai rencontré le même problème, mais dans un cas où je n'ai pas le contrôle de la production à la chaîne, qui a été pris en charge par une bibliothèque. Après avoir étudié en détails dans la mise en œuvre de type Décimal (voir http://msdn.microsoft.com/en-us/library/system.decimal.getbits.aspx), J'ai trouvé un truc intéressant (ici comme une extension de la méthode):

public static decimal Normalize(this decimal value)
{
    return value/1.000000000000000000000000000000000m;
}

L'exposant une partie de la décimale est réduite à ce qui est nécessaire. L'appel à ToString() sur la sortie décimale va écrire le nombre sans fuite 0. E. g.

1.200m.Normalize().ToString();

194voto

Dog Ears Points 3174

Il n'est pas aussi simple que cela, si l'entrée EST une chaîne de caractères? Vous pouvez utiliser l'un de ces:

string.Format("{0:G29}", decimal.Parse("2.0044"))

decimal.Parse("2.0044").ToString("G29")

2.0m.ToString("G29")

Cela devrait fonctionner pour toutes les entrées.

Mise à jour consultez le Standard de Formats Numériques , j'ai eu à définir explicitement le spécificateur de précision à 29 comme les docs indiquer clairement:

Toutefois, si le nombre est Décimal et le spécificateur de précision est omis, la notation à virgule fixe est toujours utilisé et les zéros sont conservés

Mise à jour de Konrad souligné dans les commentaires:

Observer dehors pour des valeurs comme 0.000001. G29 format de présenter le plus rapidement possible si cela va changer à la notation exponentielle. string.Format("{0:G29}", decimal.Parse("0.00000001",System.Globalization.CultureInfo.GetCultureInfo("en-US"))) donnera "1E-08" comme résultat.

103voto

Michał Powaga Points 8949

À mon avis, il est plus sûr d'utiliser des chaînes de format numérique personnalisées .

 decimal d = 0.00000000000010000000000m;
string custom = d.ToString("0.#########################");
// gives: 0,0000000000001
string general = d.ToString("G29");
// gives: 1E-13
 

18voto

DHornpout Points 1486

J'ai trouvé une solution élégante sur http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/

Fondamentalement

virgule décimale = 2,4200M;

v.ToString ("#. ######"); // retournera 2.42. Le nombre de # correspond au nombre de chiffres décimaux que vous prenez en charge.

1voto

Shimmy Points 23393

Cela fait exactement ce que vous voulez:

Si votre valeur initiale est decimal :

 decimal source = 2.4200m;
string output = ((double)source).ToString();
 

Si votre valeur initiale est string :

 string source = "2.4200";
string output = double.Parse(source).ToString();
 

Et devrait coûter une performance minimale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X