Làm cách nào để chuyển đổi một chuỗi có dấu chấm và dấu phẩy thành một số float trong Python


86

Làm cách nào để chuyển đổi một chuỗi giống như 123,456.908float 123456.908trong Python?


9
Cách thích hợp để làm điều này là sử dụng localemô-đun - mọi thứ khác chỉ là một vụ hack rất khó chịu sẽ khiến bạn gặp rắc rối trong tương lai.
Nick Bastin

Câu trả lời:


130

Chỉ cần xóa ,bằng replace():

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

14
điều này phụ thuộc vào ngôn ngữ. 9 988 776,65 € ở Pháp 9.988.776,65 € ở Đức $ 9.988.776,65 ở Hoa Kỳ
Alexandru R

Nếu bạn đang viết hằng số trong mã nguồn và muốn sử dụng dấu phẩy để làm cho nó dễ đọc hơn thì đây là cách để thực hiện thay vì ngôn ngữ mà sau đó sẽ làm cho mã bị lỗi ở một vị trí khác. python cd_size = float("737,280,000".replace(',','')) (Tôi thực sự đã sử dụng int)
hum3

Nếu bạn đang viết một chuỗi ký tự hằng số trong mã nguồn và sau đó chuyển đổi rõ ràng nó thành số nguyên hoặc float, thì đó là dấu hiệu của điều gì đó sai trong thiết kế. Nhưng ngay cả khi nó có thể được bảo vệ - chỉ cần tạm thời đặt ngôn ngữ thành ngôn ngữ mà mã được viết, cho ngữ cảnh đó, sau đó khôi phục ngữ cảnh phù hợp với người dùng của bạn khi xử lý thông tin nhập của người dùng. Đó là lý do tại sao có setlocaleở nơi đầu tiên.
Karl Knechtel

không làm điều này, nó cho phép những thứ như "123 ,,,, 345"
amohr

148

... Hoặc thay vì coi các dấu phẩy là rác cần được lọc ra, chúng ta có thể coi chuỗi tổng thể như một định dạng bản địa hóa của float và sử dụng các dịch vụ bản địa hóa:

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

3
Hầu hết các cách trực quan và trực quan cho đến nay. +1
Aufwind

2
Tôi sẽ bỏ phiếu cho câu trả lời này nếu các ví dụ bao gồm cả dấu thập phân và các ký tự nhóm chữ số trong chúng ...
martineau

14
Tốt cho một tập lệnh, không tốt cho một thư viện:Extension modules should never call setlocale()
blueFast 29/04

12
@wanderer: cái không được dùng nữa là atof phương thức nội trang của chuỗi . Những gì tôi đang sử dụng ở đây là chức năng atoftừ localemô-đun thư viện tiêu chuẩn, không bị phản đối.
Karl Knechtel

5
Đó là lý do tại sao quá trình nhập dấu sao là không tốt - Tôi khuyên bạn nên chỉnh sửa điều này để nhập những gì cần thiết hoặc không gian tên tốt hơn như tronglocale.atof
Mr_and_Mrs_D

6

Cái này thì sao?

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

Nói ngắn gọn:

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

6

Nếu bạn có dấu phẩy làm dấu phân cách số thập phân và dấu chấm là dấu phân cách hàng nghìn, bạn có thể thực hiện:

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

Hy vọng nó sẽ giúp ích


5

Nếu bạn không biết ngôn ngữ và bạn muốn phân tích cú pháp bất kỳ loại số nào, hãy sử dụng chức năng nàyparseNumber(text) . Nó không hoàn hảo nhưng hãy tính đến hầu hết các trường hợp:

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


2

Đây là một cách đơn giản tôi đã viết cho bạn. :)

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

relà một cái búa lớn cho một nhiệm vụ như vậy.
Roman Bodnarchuk

@John Doe: Có vẻ tốt hơn bây giờ. Tôi thích float(number)vì cảm giác mô tả của nó. +1 ;-)
Aufwind,

2
9 988 776,65 € ở Pháp 9.988.776,65 € ở Đức $ 9.988.776,65 ở Hoa Kỳ ----> Bạn có chắc là nó hoạt động?
Alexandru R

1

Chỉ cần thay thế ,bằng Replace ().

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

type () sẽ cho bạn thấy rằng nó đã được chuyển đổi thành float


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.