Làm thế nào để chuyển đổi một chuỗi thành một số nếu nó có dấu phẩy dưới dạng dấu phân cách hàng nghìn?


83

Tôi có một chuỗi đại diện cho một số sử dụng dấu phẩy để phân tách hàng nghìn. Làm cách nào để chuyển đổi số này thành một số trong python?

>>> int("1,000,000")

Tạo ra a ValueError.

Tôi có thể thay thế dấu phẩy bằng các chuỗi trống trước khi cố gắng chuyển đổi nó, nhưng điều đó cảm thấy sai bằng cách nào đó. Có cách nào tốt hơn?

Câu trả lời:


101
import locale
locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) 
locale.atoi('1,000,000')
# 1000000
locale.atof('1,000,000.53')
# 1000000.53

9
+1, nhưng hãy thêm cài đặt ngôn ngữ (với một ngôn ngữ mặc định của 'C'điều này sẽ vẫn cung cấp cho bạn ValueError!).
Alex Martelli

1
Tôi nghĩ rằng các phương tiện guru một cái gì đó như thế này: locale.setlocale (locale.LC_ALL, 'en_US.UTF-8')
mbarkhau

Cảm ơn các ý kiến. Tôi đã thêm một ngôn ngữ cụ thể.
unutbu

Rất đẹp. Bằng cách này, tôi có thể xử lý các số châu Âu trong đó dấu phẩy và điểm cũng được chuyển đổi. Cảm ơn.
dsimard

5
Tôi nhận được lỗi ngôn ngữ:Traceback (most recent call last): File "F:\test\locale_num.py", line 2, in <module> locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' ) File "F:\Python27\lib\locale.py", line 539, in setlocale return _setlocale(category, locale) locale.Error: unsupported locale setting
Tony Veijalainen

39

Có một số cách để phân tích cú pháp số với dấu phân cách hàng nghìn. Và tôi nghi ngờ rằng cách được @unutbu mô tả là tốt nhất trong mọi trường hợp. Đó là lý do tại sao tôi cũng liệt kê những cách khác.

  1. Nơi thích hợp để gọi setlocale()là trong __main__mô-đun. Đó là cài đặt toàn cầu và sẽ ảnh hưởng đến toàn bộ chương trình và thậm chí cả phần mở rộng C (mặc dù lưu ý rằng cài đặt LC_NUMERIC không được đặt ở cấp hệ thống mà được mô phỏng bằng Python). Đọc kỹ trong tài liệu và suy nghĩ kỹ trước khi đi theo hướng này. Nó có thể ổn trong một ứng dụng, nhưng đừng bao giờ sử dụng nó trong các thư viện dành cho nhiều đối tượng. Có thể bạn tránh yêu cầu ngôn ngữ với một số mã hóa bộ ký tự cụ thể, vì nó có thể không khả dụng trên một số hệ thống.

  2. Sử dụng một trong các thư viện của bên thứ ba để quốc tế hóa. Ví dụ: PyICU cho phép sử dụng bất kỳ wihtout ngôn ngữ có sẵn nào ảnh hưởng đến toàn bộ quá trình (và thậm chí phân tích cú pháp các số với dấu phân tách hàng nghìn cụ thể mà không sử dụng ngôn ngữ):

    NumberFormat.createInstance (Ngôn ngữ ('en_US')). Phân tích cú pháp ("1.000.000"). GetLong ()

  3. Viết chức năng phân tích cú pháp của riêng bạn, nếu bạn không cài đặt thư viện của bên thứ ba để làm điều đó "đúng cách". Nó có thể đơn giản như int(data.replace(',', ''))khi không cần xác nhận nghiêm ngặt.


1
+1 để đề xuất cách đơn giản. Đó là tất cả những gì tôi cần khi gặp vấn đề tương tự.
Michael Kristofik

Đã chỉnh sửa để sửa lỗi đánh máy ( setlocatenên được setlocale). Ngoài ra, +1.
Mark Dickinson

Tôi đã sử dụng phương án thứ ba. Vì vậy, nếu một người nào đó quan tâm, có một cái nhìn tại câu hỏi này / câu trả lời
Jan

13

Thay thế các dấu phẩy bằng các chuỗi trống và biến chuỗi kết quả thành một inthoặc a float.

>>> a = '1,000,000'
>>> int(a.replace(',' , ''))
1000000
>>> float(a.replace(',' , ''))
1000000.0

21
Vui lòng đọc lại câu hỏi OP. Cụ thể là khi anh ấy nói: "Tôi có thể thay thế dấu phẩy bằng chuỗi trống trước khi tôi cố gắng chuyển đổi nó, nhưng điều đó cảm thấy sai bằng cách nào đó. Có cách nào tốt hơn không?"
joaquin

1
Tôi thấy câu trả lời này hữu ích vì tôi có các yêu cầu gần giống với OP (chuyển đổi strs thành int), nhưng rất vui khi có một cách đơn giản hơn câu trả lời được chấp nhận.
Cái

4

Những công việc này:

(Một cách bẩn thỉu nhưng nhanh chóng)

>>> a='-1,234,567,89.0123'
>>> "".join(a.split(","))
'-123456789.0123'

3

Tôi gặp lỗi ngôn ngữ từ câu trả lời được chấp nhận, nhưng thay đổi sau hoạt động ở Phần Lan (Windows XP):

import locale
locale.setlocale( locale.LC_ALL, 'english_USA' )
print locale.atoi('1,000,000')
# 1000000
print locale.atof('1,000,000.53')
# 1000000.53

1

Tôi đã thử cái này. Nó đi xa hơn một chút so với câu hỏi: Bạn nhận được một đầu vào. Nó sẽ được chuyển đổi thành chuỗi đầu tiên (nếu nó là một danh sách, ví dụ từ Beautiful soup); sau đó đến int, rồi đến float.

Nó đi xa nhất có thể. Trong trường hợp xấu nhất, nó trả về mọi thứ chưa được chuyển đổi dưới dạng chuỗi.

def to_normal(soupCell):
''' converts a html cell from beautiful soup to text, then to int, then to float: as far as it gets.
US thousands separators are taken into account.
needs import locale'''

locale.setlocale( locale.LC_ALL, 'english_USA' ) 

output = unicode(soupCell.findAll(text=True)[0].string)
try: 
    return locale.atoi(output)
except ValueError: 
    try: return locale.atof(output)
    except ValueError:
        return output

0
>>> import locale
>>> locale.setlocale(locale.LC_ALL, "")
'en_US.UTF-8'
>>> print locale.atoi('1,000,000')
1000000
>>> print locale.atof('1,000,000.53')
1000000.53

điều này được thực hiện trên Linux ở Hoa Kỳ.


-1
#python3 tenzin
def changenum(data):
    foo = ""
    for i in list(data):
        if i == ",":
            continue
        else:
            foo += i
    return  float(int(foo))

2
Một số giải thích để đi với mã đó? Một bát súp thường được phục vụ với một thìa súp
cs95
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.