2008-12-11 4 views
10

J'ai des données d'une table dans une base de données (chaîne) qui contiennent du texte et du prix. J'extrais le prix des données mais mon problème est que parfois je peux le convertir pour flotter et parfois pas.Convertir Float avec une période au lieu d'une virgule?

J'ai remarqué que:

Convert.ToSingle(m.Groups[1].Value); 

Cela fonctionne parce que, mais pas toujours quelque temps la période est le problème (il faut une virgule). Que puis-je faire? J'ai essayé de remplacer le ".", Par "," mais parfois sur d'autres PC c'est une période qui est nécessaire!

Répondre

21

Vous avez ce problème car la conversion vérifie la langue de votre PC. Vous aurez besoin de faire quelque chose comme:

Convert.ToSingle(m.Groups[1].Value, CultureInfo.InvariantCulture.NumberFormat); 

De cette façon, il ne vérifiera pas la langue du PC. Vous pouvez trouver plus d'informations sur InvariantCulture de MSDN. J'ai quelque chose de similaire dans un projet et ma conversion fonctionne.

+0

Vous me battez de 17 secondes! Vous n'avez pas réellement besoin de la propriété NumberFormat car CultureInfo implémente déjà IFormatProvider. – leppie

+0

: P J'ai augmenter mon dactylographie puisque je participe à SO;) –

0

Comme d'autres l'ont dit:

Convert.ToSingle(m.Groups[1].Value, CultureInfo.InvariantCulture); 

Vous devez également vous assurer que vous utilisez le InvariantCulture lorsque écrit à la base de données. (Ce serait encore mieux si vous sauvegardiez les données dans une colonne avec son type de données natif, mais je m'écarte ...)

+0

Juste le fait de répéter ce qui a été dit ne vous rapportera plus. – leppie

+0

@leppie, je pense que j'ai effectivement ajouté de la valeur. Et, ne pas obtenir des upvotes ne me rapportera aucun représentant non plus. –

+0

Je suis d'accord que la valeur * a été ajoutée avec l'explication de l'exigence NumberFormat. – ZombieSheep

2

Si vous n'avez pas accès en écriture à la base de données, la première chose à faire est d'essayer convaincre les sources des données d'utiliser la culture invariante. Si les données sont entré par l'utilisateur que vous pouvez faire quelque chose comme:

float f = float.Parse(input); 
string toDb = f.ToString(CultureInfo.InvariantCulture); 

Et puis de l'autre côté:

float f = float.Parse(fromDb, CultureInfo.InvariantCulture); 
string toOutput = f.ToString(); 

Bien que si vous pouvez les convaincre de ce qu'il est sans doute mieux, comme Lette dit, pour les convaincre d'utiliser le type de données natif.

Je voudrais aussi, comme on peut le voir dans les extraits ci-dessus, en utilisant recomment float.Parse sur Convert diverses raisons, mais le plus important étant la possibilité d'utiliser TryParse:

float f; 
if (!float.TryParse(input, out f)) 
{ 
    // ERROR 
} 
5

Ou demander pour ce format de nombre spécifique explicitement:

System.Globalization.NumberFormatInfo nf 
    = new System.Globalization.NumberFormatInfo () 
{ 
    NumberGroupSeparator = "." 
}; 
float f = float.Parse ("5.34534", nf); 
Questions connexes