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.