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.