2010-11-25 47 views
3

J'ai besoin d'afficher la valeur monétaire décimale sous forme de chaîne, où les dollars et les cents sont séparés avec du texte entre les deux.Comment convertir décimal en valeur de chaîne pour les dollars et les cents séparés en C#?

123.45 => "123 Lt 45 ct" 

je suis venu avec la solution suivante:

(value*100).ToString("#0 Lt 00 ct"); 

Cependant, cette solution présente deux inconvénients:

  1. sur présentation de cette solution à un collègue programmeur, il semble être unintuitive et nécessite quelques explications.
  2. Les cents sont toujours affichés sous la forme de deux chiffres. (Pas vraiment de problème pour moi, car actuellement c'est comme ça que j'ai besoin d'être affiché.)

Y a-t-il une solution alternative élégante et simple?

Répondre

0

J'ai eu quelques erreurs avec réponse acceptée ci-dessus (il laisse tomber mon résultat un sou)

Voici ma correction

double val = 125.79; 
double roundedVal = Math.Round(val, 2); 
double dollars = Math.Floor(roundedVal); 
double cents = Math.Round((roundedVal - dollars), 2) * 100; 
8

Ceci est une opération assez simple. Cela devrait être fait d'une manière que vos collègues programmeurs comprennent instantanément. Votre solution est assez intelligente, mais l'intelligence n'est pas nécessaire ici. =)

utiliser quelque chose comme verbose

double value = 123.45; 
int dollars = (int)value; 
int cents = (int)((value - dollars) * 100); 
String result = String.Format("{0:#0} Lt {1:00} ct", dollars, cents); 
+0

En effet, un String.Format fera très bien ici, et il est facile lire et comprendre. – Jens

+1

Je voudrais faire comme Jens, puis ajouter cela comme une extensionmethod pour Decimal. Vous avez donc decimalValue.ToDollarAndCentString(); ou similaire ... – ThorHalvor

+0

Mon premier essai était juste comme celui de Jens, alors j'ai pensé à une solution plus "élégante" (que j'ai posté dans ma question), mais j'espérais juste qu'il pourrait y avoir un autre moyen. On dirait que je dois rester avec celui-ci. Merci. – Domas

0

Cela pourrait être un peu plus haut:

decimal value = 123.45M; 

int precision = (Decimal.GetBits(value)[3] & 0x00FF0000) >> 16; 
decimal integral = Math.Truncate(value); 
decimal fraction = Math.Truncate((decimal)Math.Pow(10, precision) * (value - integral)); 

Console.WriteLine(string.Format("{0} Lt {1} ct", integral, fraction)); 

Le format de la représentation binaire décimale est documentée here.