2009-03-02 46 views
31

Tôi có một chuỗi có thể là số thập phân có tiền tố "0x" hoặc số thập phân không có tiền tố đặc biệt ngoại trừ dấu trừ. "0x123" nằm trong cơ sở 16 và "-298" nằm trong cơ sở 10.cách phân tích cú pháp thập phân thập phân hoặc thập phân trong Python

Làm cách nào để chuyển đổi thành int hoặc dài bằng Python?

Tôi không muốn sử dụng eval() vì nó không an toàn và quá mức cần thiết.

+0

Tại sao eval không an toàn? Có phải những người tà ác sẽ lẻn mã vào những con số đó không? Ai có quyền truy cập vào các chuỗi đó? Họ có đáng tin cậy không? –

+9

eval không an toàn vì nó cho phép thực thi mã tùy ý. Nếu bạn nhận được chuỗi từ một nguồn đáng tin cậy, nó vẫn không an toàn, nó chỉ xảy ra khi bạn dựa vào nguồn đáng tin cậy này để không tận dụng điều đó. Nếu bạn luôn kiểm soát chuỗi, tại sao nó lại là một chuỗi? –

+0

Chương trình python của bạn có sẵn ở dạng nguồn - đó là "mã tùy ý", cũng vậy. Tại sao vẽ một đường thẳng giữa một bộ nguồn Python và một nguồn khác? Đánh giá không kém an toàn hơn khi chạy chương trình Python ngay từ đầu. –

Trả lời

52
int("0x123", 0) 

(tại sao không int("0x123") làm điều đó?)

+9

Nó chỉ là cách int được thực hiện trong Python - nó giả định số thập phân, trừ khi bạn rõ ràng nói với nó để đoán bằng cách truyền 0 là cơ số. –

+2

Tốt, vì vậy các số 0 đứng đầu không được đặt mặc định là oct. 'int (" 010 ")' trả về '10'. –

+0

Nhưng Python không đại diện cho số bát phân có số 0 đầu, chúng phải có '0o' làm tiền tố (ví dụ:' 0o10'). Tuy nhiên, trường hợp sử dụng phổ biến nhất là chuyển đổi từ số thập phân và đó là hành vi mặc định. –

5

Something như thế này có thể là những gì bạn đang tìm kiếm.

def convert(aString): 
    if aString.startswith("0x") or aString.startswith("0X"): 
     return int(aString,16) 
    elif aString.startswith("0"): 
     return int(aString,8) 
    else: 
     return int(aString) 
+0

Tại sao không sử dụng 'if aString.upper(). Startswith ('0X'):' Bằng cách đó bạn sẽ không cần hay? tất nhiên 'lower()' với ''0x'' cũng hoạt động. – a2j

+0

@ a2j: Không có lý do chính đáng. Tuy nhiên, những gì bạn có thể làm là sử dụng 'timeit' để tìm ra sự cân bằng. –

25

cơ sở 16-10 (trả về một số nguyên):

>>> int('0x123', 16) 
291 

cơ sở 10 đến 16 (trả về một string):

>>> hex(291) 
'0x123' 
-2

Đây là một phiên bản đơn giản mà hoạt động như một quyến rũ. Returns chuỗi từ hex() trả về cùng loại:

def itoh(int): return hex(int)[2:] 
+1

OP muốn chuyển đổi chuỗi thành int. Mã của bạn đi theo cách khác. –

+0

Cunfusing để nói rằng ít nhất là bạn sử dụng một từ khóa python như một tên của tham số –

0

Nếu bạn đang làm rất nhiều đi giữa với các hệ thống số khác nhau, thư viện bitstring kiếm được nhiều nhị phân hoạt động/Hex dễ dàng hơn. Nó cũng hỗ trợ giải thích chuỗi:

http://pythonhosted.org/bitstring/

Các vấn đề liên quan