Come posso convertire una stringa con punto e virgola in un float in Python


94

Come posso convertire una stringa simile 123,456.908a float 123456.908in Python?


11
Il modo corretto per farlo è usare il localemodulo: tutto il resto è solo un brutto trucco che ti metterà nei guai in futuro.
Nick Bastin

Risposte:


134

Basta rimuovere il ,con replace():

float("123,456.908".replace(',',''))

15
questo dipende dalla località. 9988776,65 € in Francia 9.988.776,65 € in Germania $ 9.988.776,65 negli Stati Uniti
Alexandru R

Se si stanno scrivendo costanti nel codice sorgente e si desidera utilizzare virgole per renderlo più leggibile, questa è la strada da percorrere piuttosto che la locale che quindi farebbe fallire il codice in un'altra posizione. python cd_size = float("737,280,000".replace(',','')) (In realtà ho usato int)
hum3

Se stai scrivendo una costante letterale stringa nel codice sorgente e poi la converti esplicitamente in intero o float, questo è un segno di qualcosa di sbagliato nel design. Ma anche se può essere difeso, è sufficiente impostare temporaneamente la locale su quella in cui è scritto il codice, per quel contesto, quindi ripristinare il contesto appropriato per gli utenti durante la gestione dell'input dell'utente. Ecco perché c'è setlocalein primo luogo.
Karl Knechtel

non farlo, consente cose come "123 ,,,, 345"
amohr

152

... Oppure invece di trattare le virgole come spazzatura da filtrare, potremmo trattare la stringa complessiva come una formattazione localizzata del float e utilizzare i servizi di localizzazione:

from locale import atof, setlocale, LC_NUMERIC
setlocale(LC_NUMERIC, '') # set to your default locale; for me this is
# 'English_Canada.1252'. Or you could explicitly specify a locale in which floats
# are formatted the way that you describe, if that's not how your locale works :)
atof('123,456') # 123456.0
# To demonstrate, let's explicitly try a locale in which the comma is a
# decimal point:
setlocale(LC_NUMERIC, 'French_Canada.1252')
atof('123,456') # 123.456

4
Finora il modo più pitonico e intuitivo. +1
Aufwind

2

14
Extension modules should never call setlocale()
Va

13
@wanderer: ciò che è deprecato è il atof metodo integrato delle stringhe . Quello che sto usando qui è la funzione atofdel localemodulo della libreria standard, che non è affatto deprecata.
Karl Knechtel

5
Ecco perché le importazioni da stelle sono pessime: ti suggerirei di modificarlo per importare ciò che è necessario o uno spazio dei nomi migliore come inlocale.atof
Mr_and_Mrs_D

8

Se non conosci la localizzazione e vuoi analizzare qualsiasi tipo di numero, usa questa parseNumber(text)funzione . Non è perfetto ma tiene conto della maggior parte dei casi:

>>> parseNumber("a 125,00 €")
125
>>> parseNumber("100.000,000")
100000
>>> parseNumber("100 000,000")
100000
>>> parseNumber("100,000,000")
100000000
>>> parseNumber("100 000 000")
100000000
>>> parseNumber("100.001 001")
100.001
>>> parseNumber("$.3")
0.3
>>> parseNumber(".003")
0.003
>>> parseNumber(".003 55")
0.003
>>> parseNumber("3 005")
3005
>>> parseNumber("1.190,00 €")
1190
>>> parseNumber("1190,00 €")
1190
>>> parseNumber("1,190.00 €")
1190
>>> parseNumber("$1190.00")
1190
>>> parseNumber("$1 190.99")
1190.99
>>> parseNumber("1 000 000.3")
1000000.3
>>> parseNumber("1 0002,1.2")
10002.1
>>> parseNumber("")

>>> parseNumber(None)

>>> parseNumber(1)
1
>>> parseNumber(1.1)
1.1
>>> parseNumber("rrr1,.2o")
1
>>> parseNumber("rrr ,.o")

>>> parseNumber("rrr1rrr")
1

7

Se hai una virgola come separatore dei decimali e il punto come separatore delle migliaia, puoi fare:

s = s.replace('.','').replace(',','.')
number = float(s)

Spero che possa aiutare


6

Che dire di questo?

 my_string = "123,456.908"
 commas_removed = my_string.replace(',', '') # remove comma separation
 my_float = float(commas_removed) # turn from string to float.

In breve:

my_float = float(my_string.replace(',', ''))


2

Ecco un modo semplice in cui ho scritto per te. :)

>>> number = '123,456,789.908'.replace(',', '') # '123456789.908'
>>> float(number)
123456789.908

reè un grande martello per un tale compito.
Roman Bodnarchuk

@ John Doe: sembra molto meglio ora. Mi piace float(number)per il suo tocco descrittivo. +1 ;-)
Aufwind

2
9988776,65 € in Francia 9.988.776,65 € in Germania $ 9.988.776,65 negli Stati Uniti ----> Sei sicuro che funzioni?
Alexandru R

1

Basta sostituire ,con replace ().

f = float("123,456.908".replace(',','')) print(type(f)

type () ti mostrerà che è stato convertito in un float


1

Soluzione migliore per diversi formati di valuta :

def text_currency_to_float(text):
  t = text
  dot_pos = t.rfind('.')
  comma_pos = t.rfind(',')
  if comma_pos > dot_pos:
    t = t.replace(".", "")
    t = t.replace(",", ".")
  else:
    t = t.replace(",", "")

  return(float(t))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.