2010-03-19 5 views
2

je dois convertir une chaîne en un format monétaire de {###}. ###. ###, ##c problème de format # chaîne pour l'argent

qui est

une valeur de 5461497702600

deviendrait

54.614.977.026,00

Les chiffres deviennent trop grandes.

J'utilise

return string.Format("{0:#" + (val < 1000 ? "" : "\\.") + "##0.00}", val); 

qui revient pour l'exemple

54614977.026,00

(un seul point)

Toute aide serait appréciée

+1

Par curiosité, est '5461497702600m.ToString (« C », someculture)' où someculture est une culture qui a ce que vous voulez (de -DE, par exemple), ou plutôt une culture personnalisée avec le symbole monétaire défini sur une chaîne vide, n'est pas suffisant? Je ne ferais jamais de telles choses manuellement si quelqu'un d'autre peut le faire :) – OregonGhost

+1

En référence à la plupart des réponses ci-dessous, n'oubliez pas que vous pouvez éviter de coder en dur vos caractères séparateurs (par exemple, ne supposez pas que le séparateur décimal est un symbole d'époque dans toutes les cultures). Voir http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.currencydecimalseparator.aspx. La liste complète: CurrencyDecimalSeparator, NumberDecimalSeparator, CurrencyGroupSeparator et NumberGroupSeparator. – rohancragg

+0

+1 @ OregonGhost/@ Rohan Cragg. J'apprécie également toutes les réponses.Reconnu que je réinventais la roue. À titre d'explication, la spécification d'origine (que le client a mal traduite) n'en a demandé qu'une seule. et celui, qui est comment je suis arrivé à la solution dans la question. Sur le site d'aller vivre, bien sûr, nous apprenons la vérité :) Cheers – Kamal

Répondre

4

Il est plus simple que vous semblez penser, il suffit d'utiliser:

decimal number = 5461497702600M; 
    string s = string.Format("{0:#,##0.00}", number); 

Il est essentiel d'utiliser decimal ici. L'image #, ## 0.00 est une manière très standard de le faire, la sortie utilisera les symboles par défaut du système et le fournisseur est assez intelligent pour répéter le groupement à 3 chiffres si nécessaire. Utilisez la surcharge suivante pour spécifier une culture, cet exemple avec le InvariantCulture utilisera toujours un point décimal:

string s = string.Format(System.Globalization.CultureInfo.InvariantCulture, 
     "{0:#,##0.00}", number); 
+0

C'est ... c'est ... génial. Merci. Par curiosité, quand vous dites qu'il est essentiel d'utiliser la décimale ... pourquoi? et qu'arrivera-t-il si je l'essaie avec un double? Ce sont les deux types que j'ai potentiellement, bien que je pense que j'utilise décimal tout au long. – Kamal

+0

@Kamal, si vous utilisez double, vous verrez des erreurs d'arrondi dans les derniers chiffres (beaucoup plus tôt qu'avec décimal). Pour l'argent, utilisez la décimale. Notez le suffixe 'M'. –

+1

Un petit nitpick: Cela formatera le nombre comme '5.461.497.702.600,00' tandis que la question spécifie qu'il devrait être' 54.614.977.026,00'. Il suffit de diviser le nombre par 100 avant d'appliquer le formatage. – LukeH

0

Je pense ce que vous essayez de faire dépend de la culture actuelle ngs de votre machine. Dans votre cas, vous essayez d'utiliser une Virgule comme décimal et une décimale Comma, le séparateur de milliers

+0

Oui, d'accord. Cependant, nous utilisons un cadre culturel qui est requis pour le reste du système qui ne prend pas en charge le format monétaire de ce pays. Donc j'ai besoin de le faire par programme. – Kamal

1

Vous pouvez utiliser le ToString overload qui prend un format string et un IFormatProvider.

Ensuite, il suffit d'utiliser N2 comme chaîne de format et d'utiliser un CultureInfo - par exemple, de-DE - qui a . comme séparateur de groupe et , comme symbole décimal:

return (val/100).ToString("N2", new CultureInfo("de-DE")); 

Attention, si val est un entier type plutôt que d'un type à virgule flottante puis en divisant par 100 perdra les deux chiffres les moins significatifs. Pour éviter cela, vous pouvez convertir la valeur entière à un decimal lors de la division:

return (val/100M).ToString("N2", new CultureInfo("de-DE")); 
+0

+1 Aussi solution très propre. – Kamal