2010-10-21 6 views
4

J'ai besoin de convertir une chaîne en un flotteur. Ceux-ci sont par exemple chaîne est ma:Conversion de chaîne à flotteur C#

1 MW 00000,00 mm
2 MW 0000,000 mm
3 MW -00000,01 mm
4 MW 00000,00 mm
5 MW 00002,92 mm
6 MW 00002,69 mm

Et voici ce que je fais:

text = text.Substring(pos + 5, 9).Trim();     
float val = 0.0F; 
float.TryParse(texto, out val); 
this.txtDimension1.Text = val.ToString(); 

d'accord, cela fonctionne pour mon environnement, qui est en_US, mais quand je lance ce même morceau de code dans un environnement espagnol, il convertit -00000.01 à -1.0

Je pense que c'est un problème de virgule, en chiffres anglais sont séparés par un point (".") et en espagnol, ils sont séparés par une virgule (",").

Comment puis-je faire ce travail sur les deux langs?

Merci, Richard.

Répondre

5

Vous devez passer CultureInfo pour la culture que les chaînes sont formatées

http://msdn.microsoft.com/en-us/library/3s27fasw.aspx

L'exemple de MSDN serait:.

double number; 

string value = "1,097.63"; 
NumberStyles style = NumberStyles.Number | NumberStyles.AllowCurrencySymbol; 
CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US"); 
if (Double.TryParse(value, style, culture, out number)) 
    Console.WriteLine("Converted '{0}' to {1}.", value, number); 
else 
    Console.WriteLine("Unable to convert '{0}'.", value); 

Alternativement, si votre entrée les chaînes sont formatées différemment, puis utilisez CultureInfo.CurrentCulture

+0

Voici un autre article sur la façon dont vous le faites. http://stackoverflow.com/questions/3059587/c-float-to-string-conversion-decimal-separator-problem –

+0

okay j'ai une question ici ... si je passe le CultureInfo pour disons, l'anglais, sera-ce être "." en anglais et "," en espagnol? merci – richardalberto

+2

@Richard. Peut-être que je ne comprends pas la question. Les chaînes * input * sont-elles formatées différemment selon la culture? – PaulG

0

Vous aurez besoin d'utiliser la surcharge de TryParse qui vous permet de spécifier la culture, vous voudrez obtenir l'information de culture pour en-us et ensuite vous pouvez l'analyser de la même manière pour tout le monde.

4

Utilisez CultureInfo.InvariantCulture.

float.TryParse(texto, NumberStyles.Any, CultureInfo.InvariantCulture, out val); 

Si les chaînes d'entrée peuvent varier, vous devrez détecter et faire correspondre votre entrée avec la culture correcte.

+0

merci, cela a aidé! :) – richardalberto

2

Vous pouvez essayer la mise en œuvre en utilisant la méthode ToSingle qui est essentiellement l'alias "Float"

en C#. Je suis d'accord avec Robert Harvey car il souligne les informations de culture et en utilisant la surcharge de Tryparse. Bonne suggestion!

+1

Il demandait une "conversion String-to-float". En regardant le code et en ajoutant une conversion correcte d'une chaîne à flotter comme "ToSingle" fait juste cela! Ce qui a été demandé et la suggestion de Roberts fixe le problème de la culture w/"espagnol". Je sentais qu'il n'était pas nécessaire d'être redondant dans ma réponse car il a déjà été répondu ci-dessus. Pour cette raison, votre logique est fausse et vous avez également besoin d'une vérification grammaticale. Vous ne voyez clairement pas l'image. D'ailleurs pourquoi aurais-je besoin d'or cette plaque pour votre compréhension quand vous avez voté contre? Si vous ne comprenez pas les conversions correctes, vous ne devriez pas juger – Nightforce2

1

Ce n'est pas une réponse à la question, mais je l'ai ajouté comme une réponse juste pour montrer le code ..

Je veux juste vous alerter sur l'utilisation Substring, il va peut causer un problème lorsque le premier nombre devient plus de 9 [Deux caractères +].

Je pense en utilisant l'expression régulière est mieux dans ce cas, ce qui est l'expression que vous avez besoin:

string str = @"4 MW +12345.67 mm"; 
Regex r = new Regex(@".* MW (?<number>.+) mm", RegexOptions.IgnoreCase); 
var match = r.Match(str); 
string matchedString = string.Empty; 
if (match.Success) 
    matchedString = match.Groups["number"].Value; 

Console.WriteLine(matchedString); 

Remarque: vous pouvez améliorer la qualité de l'expression par vérifier la valeur si elle est un numéro de flux , mais je pense que c'est suffisant pour votre situation.

Bonne chance!