En Python, comment puis - je analyser une chaîne numérique comme "545.2222"
à sa valeur flottante correspondante, 545.2222
? Ou analyser la chaîne "31"
en un entier 31
,?
Je veux juste savoir comment analyser un flotteur str
en un float
et (séparément) un int str
en un int
.
python
parsing
floating-point
type-conversion
integer
Tristan Havelick
la source
la source
type(my_object)
à lui. Le résultat peut généralement être appelé en tant que fonction pour effectuer la conversion. Par exemple, lestype(100)
résultats enint
, vous pouvez donc appelerint(my_object)
pour essayer de convertirmy_object
en un entier. Cela ne fonctionne pas toujours, mais c'est une bonne "première estimation" lors du codage.int(x) if int(x) == float(x) else float(x)
Réponses:
la source
int(a)
maisint(float(a))
?int(a)
donnera une erreur indiquant que la chaîne n'est pas un entier valide:,ValueError: invalid literal for int() with base 10: '545.222'
mais la conversion d'un flottant en un int est une conversion prise en charge.ValueError
si vous voulez être en sécuritéla source
/
opérateur sur les flotteurs / pouces. Selon le contexte, il peut être préférable de renvoyer int ou float, pas les deux.try
pour lever une exception lorsqu'elle n'est pas convertible en flottant.s = u'\u0000'
ValueError
except
Méthode Python pour vérifier si une chaîne est un flottant:
Un nom plus long et plus précis pour cette fonction pourrait être:
is_convertible_to_float(value)
Ce qui est et n'est pas un flotteur en Python peut vous surprendre:
Vous pensez savoir quels sont les chiffres? Vous n'êtes pas aussi bon que vous le pensez! Pas une grosse surprise.
N'utilisez pas ce code sur des logiciels vitaux!
Attraper de larges exceptions de cette façon, tuer les canaris et engloutir l'exception crée une toute petite chance qu'un flottant valide en tant que chaîne retourne faux. La
float(...)
ligne de code peut échouer pour mille raisons qui n'ont rien à voir avec le contenu de la chaîne. Mais si vous écrivez des logiciels vitaux dans un langage prototype de type canard comme Python, vous avez des problèmes beaucoup plus importants.la source
UTF-8
glyphe pour un chinois4
s'est transformé au fil des ans en fonction de la façon dont les développeurs stackoverflow modifient leur schéma de codage de caractères sur leur pile d'outils Microsoft. C'est une curiosité de le voir basculer au fil des ans alors que de nouveaux schémas de conversion affirment leurs nouvelles idéologies. Mais oui, toutUTF-8
glyphe pour un numérique oriental oriental n'est pas un flotteur en Python. Bazinga."- 12.3"
et"45 e6"
TypeError, ValueError
C'est une autre méthode qui mérite d'être mentionnée ici, ast.literal_eval :
Autrement dit, un «eval» sûr
la source
python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>>
Pour clarifier pourquoi c'est un problème, si vous voulez laisser les numéros de téléphone seuls et ne pas supposer que ce sont des expressions mathématiques, cette approche n'est pas pour vous.ast.literal_eval
et a été discuté ici .la source
float("nan")
est de même pour une valeur flottante parfaitement valide que la réponse ci-dessus n'attraperait pas du tout192.168.0.1
; ou"This is not a good approach. :)"
Localisation et virgules
Vous devriez considérer la possibilité de virgules dans la représentation sous forme de chaîne d'un nombre, pour les cas comme celui
float("545,545.2222")
qui lève une exception. À la place, utilisez des méthodes danslocale
pour convertir les chaînes en nombres et interpréter correctement les virgules. Lalocale.atof
méthode se transforme en un flottant en une seule étape une fois que les paramètres régionaux ont été définis pour la convention de nombre souhaitée.Exemple 1 - Conventions de numérotation aux États-Unis
Aux États-Unis et au Royaume-Uni, les virgules peuvent être utilisées comme séparateur de milliers. Dans cet exemple avec les paramètres régionaux américains, la virgule est gérée correctement comme séparateur:
Exemple 2 - Conventions de numérotation européennes
Dans la majorité des pays du monde , les virgules sont utilisées pour les décimales au lieu des points. Dans cet exemple avec les paramètres régionaux français, la virgule est correctement gérée comme une marque décimale:
La méthode
locale.atoi
est également disponible, mais l'argument doit être un entier.la source
x = '1'; locale.atof(x)
retourne1.0
quand je veux réellement1
.locale.atof(x) if locale.localeconv().get('decimal_point') in x else locale.atoi(x)
locale.atoi
dans un essai et utilisationlocale.atof
sur exception - c'est probablement plus lisible.Si vous n'êtes pas opposé aux modules tiers, vous pouvez consulter le module fastnumbers . Il fournit une fonction appelée fast_real qui fait exactement ce que cette question demande et le fait plus rapidement qu'une implémentation pure-Python:
la source
Les utilisateurs codelogic et harley sont corrects, mais gardez à l'esprit que si vous savez que la chaîne est un entier (par exemple, 545), vous pouvez appeler int ("545") sans lancer le premier casting pour flotter.
Si vos chaînes sont dans une liste, vous pouvez également utiliser la fonction de carte.
Ce n'est bon que s'ils sont tous du même type.
la source
Il est bon que vous demandiez de les faire séparément. Si vous les mélangez, vous pouvez vous préparer à des problèmes plus tard. La réponse simple est:
"545.2222"
flotter:"31"
à un entier:Autres conversions, entiers vers et depuis les chaînes et les littéraux:
Conversions de différentes bases, et vous devez connaître la base à l'avance (10 est la valeur par défaut). Notez que vous pouvez les préfixer avec ce que Python attend pour ses littéraux (voir ci-dessous) ou supprimer le préfixe:
Si vous ne connaissez pas la base à l'avance, mais vous savez qu'ils auront le bon préfixe, Python peut en déduire cela si vous passez
0
comme base:Littéraux non décimaux (c'est-à-dire entiers) d'autres bases
Si votre motivation est que votre propre code représente clairement des valeurs spécifiques codées en dur, cependant, vous n'aurez peut-être pas besoin de convertir à partir des bases - vous pouvez laisser Python le faire automatiquement pour vous avec la syntaxe correcte.
Vous pouvez utiliser les préfixes apropos pour obtenir la conversion automatique en entiers avec les littéraux suivants . Ceux-ci sont valables pour Python 2 et 3:
Binaire, préfixe
0b
Octal, préfixe
0o
Hexadécimal, préfixe
0x
Cela peut être utile lors de la description des indicateurs binaires, des autorisations de fichier dans le code ou des valeurs hexadécimales pour les couleurs - par exemple, notez les guillemets:
Rendre les octaux ambigus de Python 2 compatibles avec Python 3
Si vous voyez un entier qui commence par un 0, en Python 2, il s'agit de la syntaxe octale (obsolète).
C'est mauvais car il semble que la valeur devrait être
37
. Donc, en Python 3, il soulève maintenant unSyntaxError
:Convertissez vos octals Python 2 en octaux qui fonctionnent à la fois en 2 et 3 avec le
0o
préfixe:la source
La question semble un peu ancienne. Mais permettez-moi de suggérer une fonction, parseStr, qui rend quelque chose de similaire, c'est-à-dire qui renvoie un entier ou un flottant et si une chaîne ASCII donnée ne peut être convertie en aucune d'entre elles, elle la renvoie intacte. Le code peut bien sûr être ajusté pour ne faire que ce que vous voulez:
la source
1e3
est un nombre en python, mais une chaîne selon votre code.float("545.2222")
etint(float("545.2222"))
la source
J'utilise cette fonction pour ça
Il convertira la chaîne en son type
la source
parse_str(' 1')
(avec un espace) reviendraNone
, non1
.L' analyseur YAML peut vous aider à déterminer le type de données de votre chaîne. Utilisez
yaml.load()
, puis vous pouvez utilisertype(result)
pour tester le type:la source
la source
except
section si vous ne faites rien là-bas? float () soulèverait pour vous.int
oufloat
selon ce que la chaîne représente. Il peut augmenter les exceptions d'analyse ou [avoir un comportement inattendu] [1].la source
Vous devez prendre en compte l'arrondi pour le faire correctement.
Ie int (5.1) => 5 int (5.6) => 5 - faux, devrait être 6 donc nous faisons int (5.6 + 0.5) => 6
la source
int
etfloat
. Et cela donnera une exception, quandn
est une chaîne, comme OP le souhaite. Peut - être que vous vouliez dire: Quand unint
résultat souhaité,round
devrait être fait conversion AFTER flotter. Si la fonction doit TOUJOURS retourner un entier, alors vous n'avez pas besoin de la partie except - le corps entier de la fonction peut l'êtreint(round(float(input)))
. Si la fonction doit retourner un int si possible, sinon un flottant, alors la solution originale de javier est correcte!Je suis surpris que personne ne mentionne l'expression régulière car parfois la chaîne doit être préparée et normalisée avant de lancer le nombre
usage:
et au fait, quelque chose pour vérifier que vous avez un numéro:
la source
Pour transtyper en python, utilisez les fonctions constructeur du type, en passant la chaîne (ou la valeur que vous essayez de caster) comme paramètre.
Par exemple:
Dans les coulisses, python appelle la
__float__
méthode des objets , qui devrait renvoyer une représentation flottante du paramètre. Ceci est particulièrement puissant, car vous pouvez définir vos propres types (en utilisant des classes) avec une__float__
méthode afin qu'il puisse être converti en un float en utilisant float (myobject).la source
Il s'agit d'une version corrigée de https://stackoverflow.com/a/33017514/5973334
Cela va essayer d'analyser une chaîne et de retourner soit
int
oufloat
selon ce que la chaîne représente. Il peut augmenter les exceptions d'analyse ou avoir un comportement inattendu .la source
Passez votre chaîne à cette fonction:
Il renverra int, float ou string selon ce qui a été passé.
chaîne qui est un int
chaîne qui est un flotteur
chaîne qui est une chaîne
chaîne qui ressemble à un flotteur
la source
Utilisation:
C'est la façon la plus Pythonique que j'ai pu trouver.
la source
float
. Le bloctry
…catch
devrait probablement être à l'intérieur de lafor
boucle.Gère hex, octal, binaire, décimal et flottant
Cette solution gérera toutes les conventions de chaîne pour les nombres (tout ce que je sais).
Cette sortie de scénario de test illustre ce dont je parle.
Voici le test:
la source
Utilisation:
la source
Il s'agit d'une fonction qui convertira tout
object
(et pas seulementstr
) enint
oufloat
, selon que la chaîne réelle fournie ressemble àint
oufloat
. De plus, si c'est un objet qui a les deux méthodes__float
et__int__
, il utilise par défaut__float__
la source
En utilisant les méthodes int et float, nous pouvons convertir une chaîne en entier et en flottant.
la source
eval()
est une très bonne solution à cette question. Il n'a pas besoin de vérifier si le nombre est entier ou flottant, il donne juste l'équivalent correspondant. Si d'autres méthodes sont requises, essayeztry-except peut également être utilisé comme alternative. Essayez de convertir la chaîne en int dans le bloc try. Si la chaîne est une valeur flottante, elle générera une erreur qui sera interceptée dans le bloc except, comme ceci
la source
Voici une autre interprétation de votre question (indice: c'est vague). Il est possible que vous recherchiez quelque chose comme ceci:
Cela fonctionne comme ça ...
Théoriquement, il existe une vulnérabilité d'injection. La chaîne pourrait, par exemple, être
"import os; os.abort()"
. Sans aucun contexte sur la provenance de la chaîne, cependant, la possibilité est une spéculation théorique. La question étant vague, il n'est pas du tout clair si cette vulnérabilité existe réellement ou non.la source
eval()
est plus de 3 fois plus lente quetry: int(s) except: float(s)
.eval
c'est une mauvaise pratique (vous devez le savoir parce que vous avez une réputation de 310k)