2010-01-18 14 views
9

J'ai la valeur décimale 18.8. Les valeurs qui sont stockées dans cette variable peuvent être de n'importe quel type. Par exemple, il peut être 1.0000000 ou 1.00004000 ou 5.00000008. Je voudrais écrire une méthode pour que je puisse lui passer une décimale et obtenir une chaîne arrondie. Ce ne serait pas un problème si je connaissais les décimales je voudrais obtenir. Mais ce que je voudrais obtenir est:Comment optimiser l'arrondi des décimales en C#

Quand c'est 1.0000000 il devrait retourner 1.
Si c'est 1.00004000 il devrait renvoyer 1.00004.
Quand il est 5.00000008 il devrait retourner 5.00000008. Donc, fondamentalement, il devrait trouver tous les 0 qui sont derrière le dernier chiffre différent puis 0 et le couper.

Comment devrais-je l'aborder? Quelle est la meilleure méthode? Je reçois cette valeur de SQL et la place dans la variable décimale, mais je voudrais l'afficher et avoir 5.0000000 quand il pourrait être affiché comme 5 est un peu exagéré pour moi.

J'espère que je pourrais avoir quelques bonnes suggestions.

En ce qui concerne,

MadBoy

Répondre

9

AFAIK, ToString ("0. ##") va faire, il suffit d'augmenter de nombre # afin que votre valeur ne sera pas arrondir. .: par exemple

decimal d = 1.999m; 
string dStr = d.ToString("0.###"); 

Cela va générer chaîne "1,999" (delimiter dépend de la culture utilisée). Par conséquent, vous pouvez utiliser la chaîne de formatage très longue commune: "0.############################" - pour mettre en forme toutes vos valeurs.

+0

Je ne connais pas le nombre de décimales dont j'ai besoin. Cela fonctionnerait si je savais que je veux le couper après 3 chiffres ou plus. Mais je veux le couper seulement si tous les chiffres sont des zéros après le dernier non zéro. – MadBoy

+1

Si vous avez 1.00004000, alors après ToString ("0. ####################") vous aurez "1.00004". En parlant de MAX de # signes: il est 28. Décimal permet au maximum de 28-29 de chiffres significatifs. Cela fait 1 pour le premier zéro et 28 pour les autres signes. Même si vous avez acheté 15555.98900008900 ça ira. – terR0Q

+0

Merci, cela fonctionne. J'aurais dû le tester avant de douter qu'il fonctionnera comme vous l'avez dit. – MadBoy

2

Réduisez donc les zéros à la fin.

decimal d = 1.999m; 
string dStr = d.ToString().TrimEnd('0').TrimEnd('.'); 
+0

Et s'il y a une valeur 1,000,000.00? Puis il perd tout le zéro, je suppose? Ou il reste "1 000 000". – Webleeuw

+1

Il ne perd que les zéros après le point (.) Il reste le point, mais il pourrait juste ajouter un autre 'TrimEnd ('.')'. Pour I18N, il ne devrait pas utiliser le point, mais le séparateur spécifique à la culture. – Scoregraphic

1

Vous pouvez également utiliser string.Format et here's la documentation des différents formats possibles mais j'aime Johan Sheehans cheat sheet plus comme une référence rapide.

decimal number=4711.00004711m; 
4711.00004711 
string.Format("{0:0.#############}",number); 
"4711,00004711" 
number=42; 
42 
string.Format("{0:0.#############}",number); 
"42"