No Python, como posso analisar uma string numérica como "545.2222"
seu valor flutuante correspondente 545.2222
? Ou analise a string "31"
em um número inteiro 31
?
Eu só quero saber como analisar um float str
para a float
e (separadamente) um int str
para um int
.
python
parsing
floating-point
type-conversion
integer
Tristan Havelick
fonte
fonte
type(my_object)
-o. O resultado geralmente pode ser chamado como uma função para fazer a conversão. Por exemplo,type(100)
resulta emint
, então você pode ligarint(my_object)
para tentar convertermy_object
em um número inteiro. Isso nem sempre funciona, mas é um bom "primeiro palpite" ao codificar.int(x) if int(x) == float(x) else float(x)
Respostas:
fonte
int(a)
masint(float(a))
?int(a)
dará um erro de que a string não é um número inteiro válido:ValueError: invalid literal for int() with base 10: '545.222'
mas a conversão de um float para um int é uma conversão suportada.ValueError
se você quiser ser segurofonte
/
operador em flutuadores / entradas. Dependendo do contexto, pode ser preferível retornar int ou float, não os dois.try
para lançar uma exceção quando não for conversível para flutuar.s = u'\u0000'
ValueError
o correspondenteexcept
: PMétodo Python para verificar se uma string é flutuante:
Um nome mais longo e preciso para esta função pode ser:
is_convertible_to_float(value)
O que é e não é um flutuador no Python pode surpreendê-lo:
Você acha que sabe o que são números? Você não é tão bom quanto pensa! Não é uma grande surpresa.
Não use esse código em softwares críticos para a vida!
Capturar grandes exceções dessa maneira, matar canários e engolir a exceção cria uma pequena chance de que um float válido como string retorne falso. A
float(...)
linha de código pode falhar por milhares de razões que nada têm a ver com o conteúdo da sequência. Mas se você estiver escrevendo um software essencial para a vida em uma linguagem de protótipo de digitação de pato como o Python, terá problemas muito maiores.fonte
UTF-8
glifo para um chinês4
vem se transformando ao longo dos anos, dependendo de como os desenvolvedores do stackoverflow alteram seu esquema de codificação de caracteres na pilha de ferramentas da Microsoft. É uma curiosidade vê-lo fracassar ao longo dos anos, à medida que novos esquemas de conversão afirmam suas novas ideologias. Mas sim, qualquerUTF-8
glifo para um numérico oriental oriental não é um flutuador Python. Bazinga."- 12.3"
e"45 e6"
TypeError, ValueError
Este é outro método que merece ser mencionado aqui, ast.literal_eval :
Ou seja, um 'eval' seguro
fonte
python >>> import ast >>> ast.literal_eval('1-800-555-1212') -2566 >>>
Para esclarecer por que isso é um problema, se você deseja deixar os números de telefone em paz e não assumir que são expressões matemáticas, essa abordagem não é para você.ast.literal_eval
e foi discutido aqui .fonte
float("nan")
é um valor flutuante perfeitamente válido que a resposta acima não iria pegar em tudo192.168.0.1
; ou"This is not a good approach. :)"
Localização e vírgulas
Você deve considerar a possibilidade de vírgulas na representação de string de um número, para casos como o
float("545,545.2222")
que lança uma exceção. Em vez disso, use métodoslocale
para converter as seqüências de caracteres em números e interpretar vírgulas corretamente. Olocale.atof
método é convertido em um ponto flutuante em uma etapa depois que o código do idioma for definido para a convenção de número desejada.Exemplo 1 - Convenções de números dos Estados Unidos
Nos Estados Unidos e no Reino Unido, as vírgulas podem ser usadas como separador de milhares. Neste exemplo com a localidade americana, a vírgula é tratada corretamente como um separador:
Exemplo 2 - Convenções de números europeus
Na maioria dos países do mundo , vírgulas são usadas para marcas decimais em vez de pontos. Neste exemplo com localidade francesa, a vírgula é tratada corretamente como uma marca decimal:
O método
locale.atoi
também está disponível, mas o argumento deve ser um número inteiro.fonte
x = '1'; locale.atof(x)
retorna1.0
quando eu realmente quero1
.locale.atof(x) if locale.localeconv().get('decimal_point') in x else locale.atoi(x)
locale.atoi
em uma tentativa e usandolocale.atof
na exceção - é provavelmente mais legível.Se você não é avesso a módulos de terceiros, pode verificar o módulo fastnumbers . Ele fornece uma função chamada fast_real que faz exatamente o que esta pergunta está solicitando e faz mais rápido do que uma implementação em Python puro:
fonte
Usuários codelogic e harley estão corretos, mas lembre-se de que, se você souber que a string é um número inteiro (por exemplo, 545), é possível chamar int ("545") sem que a primeira conversão seja lançada.
Se suas strings estiverem em uma lista, você também poderá usar a função map.
Só é bom se forem todos do mesmo tipo.
fonte
É bom que você peça para fazer isso separadamente. Se você as estiver misturando, pode estar se preparando para problemas mais tarde. A resposta simples é:
"545.2222"
flutuar:"31"
para um número inteiro:Outras conversões, ints de e para strings e literais:
Conversões de várias bases, e você deve conhecer a base com antecedência (10 é o padrão). Observe que você pode prefixá-los com o que o Python espera para seus literais (veja abaixo) ou remover o prefixo:
Se você não conhece a base com antecedência, mas sabe que eles terão o prefixo correto, o Python pode inferir isso para você se você passar
0
como base:Literais não decimais (ou seja, número inteiro) de outras bases
Se sua motivação é ter seu próprio código claramente representando valores específicos codificados, no entanto, talvez você não precise converter a partir das bases - você pode deixar o Python fazer isso por você automaticamente com a sintaxe correta.
Você pode usar os prefixos apropos para obter a conversão automática em números inteiros com os seguintes literais . Estes são válidos para Python 2 e 3:
Prefixo binário
0b
Octal, prefixo
0o
Hexadecimal, prefixo
0x
Isso pode ser útil ao descrever sinalizadores binários, permissões de arquivo no código ou valores hexadecimais para cores - por exemplo, observe sem aspas:
Tornando octais ambíguos do Python 2 compatíveis com o Python 3
Se você vir um número inteiro que começa com 0, no Python 2, essa é a sintaxe octal (obsoleta).
É ruim porque parece que o valor deveria ser
37
. Portanto, no Python 3, agora gera umSyntaxError
:Converta seus octais do Python 2 em octais que funcionam em 2 e 3 com o
0o
prefixo:fonte
A questão parece um pouco antiga. Mas deixe-me sugerir uma função, parseStr, que faz algo semelhante, ou seja, retorna inteiro ou float e, se uma determinada string ASCII não puder ser convertida em nenhum deles, ela a retornará intocada. O código do curso pode ser ajustado para fazer apenas o que você deseja:
fonte
1e3
é um número em python, mas uma string de acordo com o seu código.float("545.2222")
eint(float("545.2222"))
fonte
Eu uso essa função para isso
Ele converterá a string em seu tipo
fonte
parse_str(' 1')
(com um espaço) retornaráNone
, não1
.O analisador YAML pode ajudá-lo a descobrir que tipo de dados sua string é. Use
yaml.load()
e, em seguida, você pode usartype(result)
para testar o tipo:fonte
fonte
except
seção se não está fazendo nada lá? float () aumentaria para você.int
oufloat
dependendo do que a string representa. Pode surgir analisando exceções ou [tem algum comportamento inesperado] [1].fonte
Você precisa levar em consideração o arredondamento para fazer isso corretamente.
Ou seja, int (5.1) => 5 int (5.6) => 5 - errado, deve ser 6, então fazemos int (5.6 + 0.5) => 6
fonte
int
efloat
. E isso dará uma exceção, quandon
for uma string, conforme o OP desejado. Talvez você quis dizer: Quando umint
resultado é desejado,round
deve ser feito APÓS a conversão para flutuar. Se a função SEMPRE retornar um int, você não precisará da parte exceto - todo o corpo da função pode serint(round(float(input)))
. Se a função retornar um int, se possível, caso contrário um float, a solução original de javier está correta!Estou surpreso que ninguém tenha mencionado regex porque às vezes a string deve ser preparada e normalizada antes da conversão para o número
uso:
e, a propósito, algo para verificar se você tem um número:
fonte
Para digitar em python, use as funções de construtor do tipo, passando a string (ou qualquer valor que você esteja tentando converter) como parâmetro.
Por exemplo:
Nos bastidores, python está chamando o
__float__
método de objetos , que deve retornar uma representação flutuante do parâmetro. Isso é especialmente poderoso, pois você pode definir seus próprios tipos (usando classes) com um__float__
método para que ele possa ser convertido em um float usando float (myobject).fonte
Esta é uma versão corrigida de https://stackoverflow.com/a/33017514/5973334
Isso tentará analisar uma string e retornar
int
oufloat
dependendo do que a string representa. Pode surgir a análise de exceções ou ter algum comportamento inesperado .fonte
Passe sua string para esta função:
Ele retornará int, float ou string, dependendo do que foi passado.
string que é um int
string que é uma bóia
string que é uma string
corda que parece um flutuador
fonte
Usar:
Esta é a maneira mais pitônica que eu poderia inventar.
fonte
float
. O blocotry
…catch
provavelmente deve estar dentro dofor
loop.Lida com hex, octal, binário, decimal e float
Esta solução irá lidar com todas as convenções de string para números (tudo o que eu sei).
Esta saída do caso de teste ilustra o que estou falando.
Aqui está o teste:
fonte
Usar:
fonte
Esta é uma função que converterá qualquer
object
(não apenasstr
) paraint
oufloat
, com base em se a cadeia de caracteres real fornecida for parecida comint
oufloat
. Além disso, se é um objeto que possui métodos__float
e ambos__int__
, o padrão é usar__float__
fonte
Usando métodos int e float, podemos converter uma string em número inteiro e floats.
fonte
eval()
é uma solução muito boa para esta pergunta. Ele não precisa verificar se o número é int ou float, apenas fornece o equivalente correspondente. Se outros métodos forem necessários, tentetry-except também pode ser usado como alternativa. Tente converter a string em int dentro do bloco try. Se a string for um valor flutuante, gerará um erro que será capturado no bloco de exceção, como este
fonte
Aqui está outra interpretação da sua pergunta (dica: é vaga). É possível que você esteja procurando algo assim:
Funciona assim ...
Teoricamente, há uma vulnerabilidade de injeção. A cadeia poderia, por exemplo, ser
"import os; os.abort()"
. Sem qualquer conhecimento de onde a corda vem, a possibilidade é especulação teórica. Como a pergunta é vaga, não está claro se essa vulnerabilidade existe ou não.fonte
eval()
é mais de três vezes mais lenta quetry: int(s) except: float(s)
.eval
é uma prática ruim (você deve saber porque você tem 310k reputação)