2010-10-06 10 views
12

J'ai une méthode qui retourne des nombres comme ceci:Séparateur décimal C#?

public decimal GetNumber() 
{ 
    return 250.00m; 
} 

Maintenant, lorsque cette valeur est imprimée à la console par exemple, il a une virgule (250,00) au lieu d'un point (250.00). Je veux toujours un point ici, qu'est-ce que je fais mal?

+6

Si vous n'êtes pas au courant: ',' ​​est utilisé comme un séparateur décimal dans de nombreux pays européens, tels que l'Allemagne, la France et l'Italie. Peut-être que vous avez votre culture définie à l'un de ces endroits? –

+0

J'ai testé cette fonction dans une application de console et fonctionne bien pour moi. Est affiché avec le point (250.00). –

Répondre

48

decimal lui-même n'a pas de formatage - il n'a ni une virgule ni un point.

C'est quand vous le convertissez en une chaîne que vous l'aurez. Vous pouvez vous assurer d'obtenir un point en spécifiant la culture invariant:

using System; 
using System.Globalization; 
using System.Threading; 

class Test 
{ 
    static void Main() 
    { 
     Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR"); 
     decimal d = 5.50m; 
     string withComma = d.ToString(); 
     string withDot = d.ToString(CultureInfo.InvariantCulture); 
     Console.WriteLine(withComma); 
     Console.WriteLine(withDot); 
    } 
} 
+1

System.Globalization.CultureInfo germanCultureInfo = new System.Globalization.CultureInfo ("de-DE"); décimal d = 0,3 m; chaîne s1 = d.ToString (allemandCultureInfo); -> s1 est 0,3 pas 0,3. Pourquoi? – Offler

+1

@Offler: Je ne peux pas reproduire cela - ce code * exact * me donne "0,3". –

+1

Arrivé chez un client. Était la recherche sur Internet pour savoir pourquoi ... Solution maintenant trouvé chez les clients PC - Paramètres Windows où changé. – Offler

1

Formatage spécifique aux paramètres régionaux? (Vert est une virgule, donc si vous appelez ToString() sur votre décimale en utilisant l'information culturelle de l'un de ces endroits, vous verrez une virgule).

6

Comme expliqué par Jon Skeet, vous devez spécifier la culture utilisé pour formater le string:

var str = GetNumber().ToString(System.Globalization.CultureInfo.InvariantCulture); 

Il est une bonne pratique utilisez toujours la surcharge ToString dans laquelle vous spécifiez la culture. Dans le cas contraire, .NET utiliser le thread courant Culture, qui écrirait différents strings à la sortie en fonction de l'environnement local du PC ...

+1

... d'autre part, il pourrait aussi bien être que l'utilisation du courant locale sur le PC (étant donné que nous ne parlons pas d'application web) est le comportement préféré. Ce serait après tout ce que l'utilisateur a l'habitude de voir. –

+2

Oui, je suis d'accord avec vous. C'est un comportement valide lorsque la chaîne sera utilisée dans l'interface utilisateur. Mais cela peut être un vrai problème lorsque la chaîne est utilisée pour effectuer une sorte de sérialisation.Dans ce cas, la désérialisation peut échouer en fonction de l'environnement local du PC en cours d'exécution ... Et vous ne le verrez pas avant que le produit ne soit livré sur une plate-forme avec des paramètres régionaux différents. Je préfère prendre quelques secondes pour y réfléchir (et prendre une décision raisonnable à ce sujet) plutôt que de le regretter plus tard. – Eilistraee

0

Je l'ai vérifié avec Visual Studio 2008 (application de la console) et son ne pas montrer « » au lieu de "." , veuillez fournir plus de détails. Je pense à son problème de culture-info. S'il vous plaît fournir plus de détails de code

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.Write(GetNumber()); 
    } 
    public static decimal GetNumber() 
    { 
     return 250.00m; 
    } 

} 
Questions connexes