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:
À 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\.])+