Python'da nokta ve virgül içeren bir dizeyi şamandıraya nasıl dönüştürebilirim


94

Python'da 123,456.908float gibi bir dizeyi nasıl dönüştürebilirim 123456.908?


11
Bunu yapmanın doğru yolu localemodülü kullanmaktır - diğer her şey gelecekte başınızı belaya sokacak çok kötü bir hack'tir.
Nick Bastin

Yanıtlar:


134

Sadece kaldırmak ,ile replace():

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

15
bu yerel ayara bağlıdır. Almanya'da 9.988.776,65 € 9.988.776,65 € Amerika Birleşik Devletleri'nde 9.988.776,65
Alexandru R

Kaynak kodda sabitler yazıyorsanız ve daha okunaklı hale getirmek için virgül kullanmak istiyorsanız, o zaman kodun başka bir konumda başarısız olmasına neden olacak yerel ayar yerine bu yol budur. python cd_size = float("737,280,000".replace(',','')) (Aslında int kullandım)
hum3

Kaynak kodda bir dize değişmezi sabiti yazıyor ve daha sonra bunu açıkça tam sayıya veya kayan noktaya dönüştürüyorsanız, bu, tasarımda yanlış bir şeyin işaretidir. Ancak savunulabilse bile - sadece o bağlam için yerel ayarı kodun yazıldığı bir yere geçici olarak ayarlayın ve ardından kullanıcı girdisini işlerken kullanıcılarınız için uygun bağlamı geri yükleyin. Bu yüzden setlocaleilk etapta var.
Karl Knechtel

bunu yapmayın, "123 ,,,, 345" gibi şeylere izin verir
amohr

152

... Veya virgüllere filtrelenecek çöp gibi davranmak yerine, genel dizeyi kayan noktaların yerelleştirilmiş bir biçimlendirmesi olarak ele alabilir ve yerelleştirme hizmetlerini kullanabiliriz:

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
Şimdiye kadarki en pitonik ve sezgisel yol. +1
Aufwind

2
Örnekler hem ondalık nokta hem de rakam gruplama karakterleri içeriyorsa, bu cevaba oy verirdim ...
martineau

14
Bir senaryo için iyi, bir kütüphane için kötü:Extension modules should never call setlocale()
blueFast

13
@wanderer: Kullanımdan kaldırılan şey, atof dizelerin yerleşik yöntemidir . Burada kullandığım şey, standart kitaplık modülünün işlevidir atofve bu localehiç kullanımdan kaldırılmamıştır.
Karl Knechtel

5
Bu yüzden yıldız içe aktarmalar kötü - bunu ya gerekli olanı ya da daha iyi bir ad alanını içe aktarmak için düzenlemenizi öneririmlocale.atof
Mr_and_Mrs_D

8

Yerel ayarı bilmiyorsanız ve herhangi bir sayıyı ayrıştırmak istiyorsanız, bu parseNumber(text)işlevi kullanın . Mükemmel değil ama çoğu durumu hesaba katın:

>>> 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

Ondalık ayırıcı olarak virgül ve binlik ayırıcı olarak nokta varsa, şunları yapabilirsiniz:

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

Umarım yardımcı olur


6

Peki buna ne dersin?

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

Kısacası:

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


2

İşte senin için yazdığım basit bir yol. :)

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

reböyle bir görev için büyük bir çekiç.
Roman Bodnarchuk

@John Doe: Şimdi çok daha iyi görünüyor. float(number)Açıklayıcı dokunuşundan dolayı seviyorum . +1 ;-)
Aufwind

2
Almanya'da 9 988 776,65 € Almanya'da 9,988,776,65 € Amerika Birleşik Devletleri'nde 9,988,776,65 $ ----> Çalıştığından emin misiniz?
Alexandru R

1

Sadece yerini ,değiştirmek ile ().

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

type () size bir float'a dönüştüğünü gösterecek


1

Farklı para birimi biçimleri için daha iyi çözüm :

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))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.