Domanda Come analizzo una stringa su float o int in Python?


In Python, come posso analizzare una stringa numerica come "545.2222" al suo valore float corrispondente, 542.2222? O analizzare la stringa "31" a un intero, 31?

Voglio solo sapere come analizzare un galleggiante  string a a floate (separatamente) a int  string ad int.


1757
2017-12-19 01:52


origine


risposte:


>>> a = "545.2222"
>>> float(a)
545.22220000000004
>>> int(float(a))
545

2083
2017-12-19 01:54



def num(s):
    try:
        return int(s)
    except ValueError:
        return float(s)

441
2017-12-19 02:31



Metodo Python per verificare se una stringa è un float:

def isfloat(value):
  try:
    float(value)
    return True
  except:
    return False

Un nome più lungo e più accurato per questa funzione potrebbe essere: isConvertibleToFloat(value)

Cos'è, e non è un galleggiante Pitone potrebbe sorprenderti:

val                   isfloat(val) Note
--------------------  ----------   --------------------------------
""                    False        Blank string
"127"                 True         Passed string
True                  True         Pure sweet Truth
"True"                False        Vile contemptible lie
False                 True         So false it becomes true
"123.456"             True         Decimal
"      -127    "      True         Spaces trimmed
"\t\n12\r\n"          True         whitespace ignored
"NaN"                 True         Not a number
"NaNanananaBATMAN"    False        I am Batman
"-iNF"                True         Negative infinity
"123.E4"              True         Exponential notation
".1"                  True         mantissa only
"1,234"               False        Commas gtfo
u'\x30'               True         Unicode is fine.
"NULL"                False        Null is not special
0x3fade               True         Hexadecimal
"6e7777777777777"     True         Shrunk to infinity
"1.797693e+308"       True         This is max value
"infinity"            True         Same as inf
"infinityandBEYOND"   False        Extra characters wreck it
"12.34.56"            False        Only one dot allowed
u'四'                 False        Japanese '4' is not a float.
"#56"                 False        Pound sign
"56%"                 False        Percent of what?
"0E0"                 True         Exponential, move dot 0 places
0**0                  True         0___0  Exponentiation
"-5e-5"               True         Raise to a negative number
"+1e1"                True         Plus is OK with exponent
"+1e1^5"              False        Fancy exponent not interpreted
"+1e1.3"              False        No decimals in exponent
"-+1"                 False        Make up your mind
"(1)"                 False        Parenthesis is bad

Pensi di sapere quali sono i numeri? Non sei così bravo come pensi! Non grande sorpresa.


416
2018-01-05 04:15



Questo è un altro metodo che merita di essere menzionato qui, ast.literal_eval:

Questo può essere usato per valutare in modo sicuro le stringhe contenenti espressioni Python da fonti non attendibili senza la necessità di analizzare i valori stessi.

Cioè, una 'valutazione' sicura

>>> import ast
>>> ast.literal_eval("545.2222")
545.2222
>>> ast.literal_eval("31")
31

104
2018-03-01 04:23



float(x) if '.' in x else int(x)

74
2017-12-19 02:32



Localizzazione e virgole

Si dovrebbe considerare la possibilità di virgole nella rappresentazione di stringa di un numero, per casi come float("545,545.2222") che genera un'eccezione. Invece, utilizzare i metodi in locale per convertire le stringhe in numeri e interpretare correttamente le virgole. Il locale.atof il metodo converte in float in un passaggio una volta che le impostazioni internazionali sono state impostate per la convenzione numerica desiderata.

Esempio 1 - Convenzioni sul numero degli Stati Uniti 

Negli Stati Uniti e nel Regno Unito, le virgole possono essere utilizzate come separatore di migliaia. In questo esempio con le impostazioni internazionali americane, la virgola viene gestita correttamente come separatore:

>>> import locale
>>> a = u'545,545.2222'
>>> locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.atof(a)
545545.2222
>>> int(locale.atof(a))
545545
>>>

Esempio 2 - Convenzioni numeriche europee

Nel maggioranza dei paesi del mondo, le virgole vengono utilizzate per i segni decimali anziché per i punti. In questo esempio con le impostazioni internazionali francesi, la virgola viene gestita correttamente come un segno decimale:

>>> import locale
>>> b = u'545,2222'
>>> locale.setlocale(locale.LC_ALL, 'fr_FR')
'fr_FR'
>>> locale.atof(b)
545.2222

Il metodo locale.atoi è anche disponibile, ma l'argomento dovrebbe essere un numero intero.


45
2017-07-23 16:00



utenti codelogic e Harley sono corretti, ma tieni presente che se sai che la stringa è un numero intero (ad esempio, 545) puoi chiamare int ("545") senza prima eseguire il casting su float.

Se le tue stringhe sono in una lista, potresti usare anche la funzione mappa.

>>> x = ["545.0", "545.6", "999.2"]
>>> map(float, x)
[545.0, 545.60000000000002, 999.20000000000005]
>>>

Va bene solo se sono tutti dello stesso tipo.


22
2017-12-19 02:09