Pourquoi dois-je obtenir un FormatException lors de la conversion d'une chaîne à une variable?
Quand j'essaie de convertir une chaîne de caractères à flotteur:
Console.WriteLine(float.Parse("6.59"));
il déclenche une exception:
Exception Non Gérée: System.FormatException: chaîne d'Entrée n'était pas dans un bon f
ormat.
au Système.Numéro.ParseSingle(Chaîne de valeur, les options NumberStyles, NumberFormat
Info numfmt)
Quand je l'ai essayer comme ceci:
Console.WriteLine(Convert.ToSingle("6.59"));
Il jette la même exception:
Exception Non Gérée: System.FormatException: chaîne d'Entrée n'était pas dans un bon f
ormat.
au Système.Numéro.ParseSingle(Chaîne de valeur, les options NumberStyles, NumberFormat
Info numfmt)
au Système.Convertir des.ToSingle(Chaîne de valeur)
Pouvez-vous expliquer pourquoi cela se produit?
Avez-vous essayé de casser le code vers le bas dans des lignes distinctes et pas à pas à travers le débogueur?
Quelle est votre culture?
Quelle est votre culture?
OriginalL'auteur Edward83 | 2011-04-08
Vous devez vous connecter pour publier un commentaire.
Le seul argument de la méthode d'analyse utilise la culture pour analyser la chaîne. Si votre culture actuelle utilise une autre séparateur décimal, ce sera un échec.
Essayez d'utiliser l'invariant de la culture:
OriginalL'auteur R. Martinho Fernandes
Le problème ici, c'est votre culture.
Soit définir les invariants de la culture comme ceci:
ou utiliser le bon séparateur décimal pour votre culture
Je me demande pourquoi vous utilisez une chaîne littérale. Si vous rencontrez des problèmes pour accéder à littérale de flotteurs, vous pouvez utiliser
Si vous le faites de cette façon, la culture n'a pas d'importance parce que la valeur est décidé au moment de la compilation.
Fustigé les unités impériales! Aller Métrique! (je plaisante) j'ai oublié que le royaume-UNI utilise encore le système impérial 🙂 Mais mon point est toujours debout, si il va mettre les littéraux de chaîne en
float.Parse
il fait tout mal.OriginalL'auteur Jonas Van der Aa
Vous êtes probablement à l'aide d'une culture qui utilise le
,
comme séparateur décimal.Vous pourriez essayer de Analyser à l'aide de la InvariantCulture:
OriginalL'auteur GvS
Spécifiques à la Culture de choses. Quelle est votre culture par défaut?
Certaines cultures "," au lieu de ".". Vous pouvez essayer ceci:
OriginalL'auteur Unknown
Il pourrait y avoir de problème avec les paramètres Régionaux/Culture. Vous devez définir
,
au lieu de.
pour le séparateur décimal..
est le chiffre séparateur de groupe (aka le séparateur de milliers). En raison de cettefloat.Parse("6.59")
ne manque pas, mais le résultat est659
. C'est gaspillée moi une couple d'heures dans le passé 🙁OriginalL'auteur x2.
Je connais tout le monde ici a déjà donné la raison pour laquelle le problème de l'expérience, mais peut-être quelqu'un devrait étendre sur les raisons de l'Invariant de correctifs.
La classe CultureInfo est utilisé soit directement ou indirectement par les classes de ce format, l'analyse, ou manipuler de la culture-des données spécifiques, tels que la Chaîne, DateTime, DateTimeOffset, et les types numériques pour composer avec les différences dans la façon dont les différentes cultures écrire ces types.
En cas de type décimal certaines cultures, utiliser un point(.) tandis que d'autres utilisent une virgule (,). Par défaut, lorsque vous utilisez les Bibliothèques de Conversion, elle fera usage de votre local de la culture (qui est le pays de votre système d'exploitation pour configuré pour).
En spécifiant l'Invariant de vous dire que vous vous attendez à ce séparateurs de milliers à être des virgules(,) et le séparateur décimal à un point(.) comme il est dans la plupart des cultures.
Un gros problème qui arrive parfois, c'est que ces conventions culturelles changement de l'OS de point de vue. Par exemple l'Afrique du Sud (ZA) info culture utilisé pour se comporter comme l'invariant de la culture. Microsoft a changé avec Windows 8, où la virgule est soudainement devenu une virgule et le séparateur de milliers de un espace.Cela a entraîné de nombreux systèmes hérités écrit .Net soudainement casser quand on a migré vers les nouveaux systèmes d'exploitation.
En fin de compte, face à normaliser tous les culture locale info à invariante et de persister et de traiter avec eux dans une logique d'entreprise dans ce format. Puis localiser sur le front-end. En va de même pour le type DateTime, dès que cela est possible de convertir à l'UTC, et seulement lorsque vous effectuez le rendu d'une sortie.
OriginalL'auteur Sarel Esterhuizen
Vous pouvez également essayer de Convertir de la classe pour effectuer cette tâche.
Convertir.ToDecimal("6.59");
OriginalL'auteur user698555