Je veux analyser une chaîne comme "3.5"
un double. cependant,
double.Parse("3.5")
donne 35 et
double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint)
jette a FormatException
.
Maintenant, les paramètres régionaux de mon ordinateur sont définis sur l'allemand, où une virgule est utilisée comme séparateur décimal. Il faudra peut-être faire quelque chose avec cela et double.Parse()
attendre "3,5"
en entrée, mais je ne suis pas sûr.
Comment analyser une chaîne contenant un nombre décimal qui peut ou non être formaté comme spécifié dans mes paramètres régionaux actuels?
Réponses:
la source
XmlConvert
classe ... avez-vous des idées si c'est mieux, pire et / ou différent que d'utiliserCultureInfo.InvariantCulture
?XmlConvert
n'est pas vraiment destiné à être utilisé pour analyser une seule valeur double dans le code. Je préfère utiliserdouble.Parse
ouConvert.ToDouble
qui rendent mon intention évidente.J'utilise habituellement une fonction multiculturelle pour analyser les entrées utilisateur, principalement parce que si quelqu'un est habitué au pavé numérique et utilise une culture qui utilise une virgule comme séparateur décimal, cette personne utilisera le point du pavé numérique au lieu d'une virgule.
Attention cependant, les commentaires @nikie sont vrais. Pour ma défense, j'utilise cette fonction dans un environnement contrôlé où je sais que la culture peut être en-US, en-CA ou fr-CA. J'utilise cette fonction parce qu'en français, nous utilisons la virgule comme séparateur décimal, mais quiconque ayant déjà travaillé dans la finance utilisera toujours le séparateur décimal sur le pavé numérique, mais c'est un point, pas une virgule. Donc, même dans la culture fr-CA, j'ai besoin d'analyser le nombre qui aura un point comme séparateur décimal.
la source
Je n'ai pas pu écrire de commentaire, alors j'écris ici:
double.Parse ("3.5", CultureInfo.InvariantCulture) n'est pas une bonne idée, car au Canada, nous écrivons 3,5 au lieu de 3,5 et cette fonction nous donne 35 en conséquence.
J'ai testé les deux sur mon ordinateur:
C'est une façon correcte que Pierre-Alain Vigeant a mentionnée
la source
Remplacez la virgule par un point avant l'analyse. Utile dans les pays avec une virgule comme séparateur décimal. Pensez à limiter l'entrée utilisateur (si nécessaire) à une virgule ou à un point.
la source
L'astuce consiste à utiliser la culture invariante, pour analyser les points dans toutes les cultures.
la source
Regardez, chaque réponse ci-dessus qui propose d'écrire un remplacement de chaîne par une chaîne constante ne peut être que fausse. Pourquoi? Parce que vous ne respectez pas les paramètres de région de Windows! Windows garantit à l'utilisateur la liberté de définir le caractère de séparation qu'il souhaite. Il peut ouvrir le panneau de contrôle, aller dans le panneau de région, cliquer sur avancé et changer le personnage à tout moment. Même pendant l'exécution de votre programme. Pensez à ça. Une bonne solution doit en être consciente.
Donc, vous devrez d'abord vous demander, d'où vient ce nombre, que vous voulez analyser. Si cela provient d'une entrée dans le .NET Framework, aucun problème, car il sera au même format. Mais peut-être que cela venait de l'extérieur, peut-être d'un serveur externe, peut-être d'une ancienne base de données qui ne prend en charge que les propriétés de chaîne. Là, l'administrateur de la base de données aurait dû donner une règle dans quel format les nombres doivent être stockés. Si vous savez par exemple que ce sera une base de données américaine au format américain, vous pouvez utiliser ce morceau de code:
Cela fonctionnera bien partout dans le monde. Et veuillez ne pas utiliser 'Convert.ToXxxx'. La classe 'Convert' est uniquement conçue comme une base pour les conversions dans n'importe quelle direction. En outre: Vous pouvez également utiliser le mécanisme similaire pour DateTimes.
la source
la source
Mes deux cents sur ce sujet, en essayant de fournir une méthode générique de double conversion:
Fonctionne comme prévu avec:
Aucune conversion par défaut est mis en œuvre, il échouerait en essayant d'analyser
1.3,14
,1,3.14
ou des cas similaires.la source
Le code suivant fait le travail dans n'importe quel scénario. C'est un peu l'analyse.
la source
Je pense qu'une conversion correcte à 100% n'est pas possible, si la valeur provient d'une entrée utilisateur. Par exemple, si la valeur est 123,456, il peut s'agir d'un regroupement ou d'un point décimal. Si vous avez vraiment besoin de 100%, vous devez décrire votre format et lever une exception s'il n'est pas correct.
Mais j'ai amélioré le code de JanW, nous obtenons donc un peu plus d'avance sur le 100%. L'idée derrière est que si le dernier séparateur est un groupSeperator, ce serait plus un type entier qu'un double.
Le code ajouté est dans le premier if de GetDouble .
la source
la source
Au lieu d'avoir à spécifier des paramètres régionaux dans toutes les analyses, je préfère définir des paramètres régionaux pour toute l'application, bien que si les formats de chaîne ne sont pas cohérents dans l'application, cela pourrait ne pas fonctionner.
Si vous le définissez au début de votre application, toutes les analyses doubles attendent une virgule comme délimiteur décimal. Vous pouvez définir un paramètre régional approprié afin que le séparateur décimal et des milliers corresponde aux chaînes que vous analysez.
la source
C'est difficile sans spécifier le séparateur décimal à rechercher, mais si vous le faites, voici ce que j'utilise:
Cela devrait fonctionner avec n'importe quelle culture. Il échoue correctement à analyser les chaînes qui ont plus d'un séparateur décimal, contrairement aux implémentations qui remplacent au lieu de swap.
la source
J'ai également amélioré le code de @JanW ...
J'en ai besoin pour formater les résultats d'instruments médicaux, et ils envoient également "> 1000", "23.3e02", "350E-02" et "NÉGATIF".
la source
la source
Je pense que c'est la meilleure réponse:
la source
Ce qui suit est moins efficace, mais j'utilise cette logique. Ceci n'est valable que si vous avez deux chiffres après le point décimal.
la source
Multipliez le nombre, puis divisez-le par ce que vous avez multiplié auparavant.
Par exemple,
la source