2010-10-05 26 views
4

J'ai besoin d'afficher une devise dans mon application ASP.NET MVC mais quand la devise est 0, je voudrais afficher "Free" (localisée de bien sûr!) au lieu de 0,00 $.

Alors, quand j'ai quelque chose comme ça ...

Decimal priceFree = 0.00; 
Decimal priceNotFree = 100.00; 

priceFree.ToString("C"); 
priceNotFree.ToString("C"); 

La sortie est "0,00 $" "100,00 $"

Je voudrais que ce soit "Free" "100,00 $" J'imagine que je peux utiliser la méthode .ToString (format de chaîne, IFormatProvider formatProvider) pour accomplir ceci mais je ne suis pas sûr de la façon de procéder. Évident que je veux réutiliser autant de NumberFormatInfo que possible et ne le remplacer que lorsque l'entrée est 0. Dans ce cas, je peux simplement retourner une ressource localisée qui contient ma chaîne "Free".

Alors, comment faire?

Merci

+2

je recommande l'introduction d'une classe Argent/devise au lieu de passer autour de décimales. Cela vous permettrait de le faire beaucoup plus facilement et parce que la devise a beaucoup plus de choses à faire que les décimales. –

Répondre

4

Je pense que la meilleure façon d'aller serait une méthode d'extension:

public static string ToPriceString(this decimal value) 
{ 
    if (value <= 0m) 
     return "Free"; // Your localized resource 
    else 
     return value.ToString("C"); 
} 

Si tu veux aller w avec le IFormatProvider, there is a good example on MSDN.

+0

Je ne suis pas un grand fan des méthodes d'extension est ma principale raison. Mais dans ce cas, ce pourrait être une mauvaise excuse. La solution la plus simple est souvent la meilleure et, dans ce cas, la méthode d'extension est très simple. – Justin

+0

BTW: Toute chance que vous pouvez fournir plus d'informations sur la valeur <= 0m. Je ne suis pas super famille avec la syntaxe 0m. Merci! – Justin

+0

Ok ... alors decimal explique le m. J'étais curieux de savoir quelle valeur <= 0m reviendrait pour un nombre négatif. Mais je suppose que dans ce cas, il n'y a pas de prix négatif. – Justin

2

Que diriez-vous d'une méthode d'extension:

public static string FreeString(this decimal dec) 
{ 
    if(dec == 0M) 
    { 
     return "Free"; 
    } 
    else 
    { 
     return dec.ToString("C"); 
    } 
} 

Puis

priceFree.FreeString(); 
priceNotFree.FreeString(); 
0

Au lieu d'utiliser un IFormatProvider personnalisé et en passant chaque fois, que diriez-vous:

public static class MyFormatter 
    { 
     public static string ToFreeString(this decimal d) 
     { 
      return d == 0 ? "Free" : d.ToString("d"); 
     } 
    } 
16

Utilisez

.ToString("$###.00;;Free") 
+2

+1, bien. Pour quelqu'un d'autre qui n'a pas vu cela auparavant: [Le ";" Section Separator ] (http://msdn.microsoft.com/en-us/library/0c899ak8.aspx#SectionSeparator). –

+0

Cela semble intéressant. Pouvez-vous fournir une référence ou peut-être décrire votre réponse un peu plus? Je ne suis pas vraiment sûr de ce qui se passe là-bas avec la chaîne de format. Il ne semble pas très facile à localiser. – Justin

+2

Cette approche n'est pas bonne lorsque la localisation – Sadegh