Lecture d’une double valeur d’une chaîne

J’ai essayé de résoudre ce problème pendant des heures et je ne comprends absolument pas ce que le compilateur fait ici. J’ai des chaînes qui ressemblent fondamentalement à ceci:

"KL10124 Traitor #2 - +XX-+0.25 - More Stuff" 

et besoin de lire le double ‘0,25’ par programme. En appelant la chaîne au-dessus de s, les deux lignes suivantes ne fonctionnent pas:

 ssortingng[] h = s.Split('-'); ssortingng h2 = h[2].Subssortingng(1,h[2].Length - 2); double d = Convert.ToDouble(h2); 

La sortie si j’affiche d est “25”. Je pensais que cela pourrait dépendre du ‘.’ resp ‘,’ culture dependency, mais si j’insère

 double d = Convert.ToDouble(h2.Replace('.',',')); 

cela ne change rien, la sortie est toujours “25”.

Mais finalement, si je fais la méthode de la force brute comme ci-dessous, le résultat “0,25” est affiché à l’écran

 double d; ssortingng[] h = s.Split('-'); ssortingng h2 = h[2].Subssortingng(1,h[2].Length - 2); if (h2.Contains(".")) { ssortingng[] h3 = h2.Split('.'); d = Convert.ToDouble(h3[0]) + Convert.ToDouble(h3[1])/100; } else { d = Convert.ToDouble(h2); } return d; 

Pourquoi les deux premières versions ne fonctionnent-elles pas exactement? Le dernier bit de code ne peut pas être la bonne façon de faire cela.

Essayez d’utiliser

 double d = Convert.ToDouble(h2, CultureInfo.InvariantCulture); 

au lieu de

 double d = Convert.ToDouble(h2); 

Un certain nombre de personnes ont déjà mentionné l’utilisation de Regex. Si vous n’êtes pas très familier avec Regex, cette page peut vous aider:

http://txt2re.com/index-csharp.php3?s=%22KL10124%20Traitor%20%232%20-%20%2bXX-%2b0.25%20-%20More%20Stuff%22&-7

À votre santé

 d = double.Parse(h2,CultureInfo.InvariantCulture); 

Vous devez définir le fournisseur de format de l’opération de conversion sur invariant.

Essayez la manière Regex:

 ssortingng input = "KL10124 Traitor #2 - +XX-+0.25 - More Stuff"; Match match = Regex.Match(input, "^.*([0-9]+\\.[0-9]+).*$"); if (match.Success) { double value = Convert.ToDouble(match.Groups[1].Value, CultureInfo.InvariantCulture); Console.Write(value); } 

Vous devriez regarder h2 avant de convertir. Il semble que cela n’inclue pas le point décimal. Convert.ToDouble pourrait demander au 0 principal de savoir que c’est une fraction également, je ne suis pas certain.

En général, cela est beaucoup plus facile avec une regex. Voir cette réponse .

Utilisez une requête RegEx comme ceci:

 ^KL\d+ Traitor #\d \- \+XX\-\+(\d+\.\d+) \- .+ 

Un regroupement (expression entre parenthèses) donnera le résultat.

Voir le bac à sable .

Imprimez h2 dans le premier exemple de code pour voir si vous effectuez correctement l’extraction de sous-chaîne.

Utiliser également une expression régulière pour extraire le nombre serait plus simple.

Utilisez Regex

 (?<=\+)([0-9\.])+