Lý lịch
Tôi có một chuỗi trong Python mà tôi muốn chuyển đổi thành một số nguyên. Thông thường, tôi sẽ chỉ sử dụng int
:
>>> int("123")
123
Thật không may, phương pháp này không mạnh mẽ lắm, vì nó chỉ chấp nhận các chuỗi khớp -?[0-9]+
(sau khi xóa bất kỳ khoảng trắng hàng đầu hoặc dấu). Ví dụ: nó không thể xử lý đầu vào có dấu thập phân:
>>> int("123.45")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '123.45'
Và nó chắc chắn không thể xử lý điều này:
>>> int("123abc?!")
Mặt khác, chính xác hành vi này có thể có mà không có bất kỳ phiền phức nào trong Perl, PHP và thậm chí cả QBasic khiêm tốn:
INT(VAL("123abc")) ' 123
Câu hỏi
Đây là nỗ lực ngắn nhất của tôi tại "tổng quát int
" này trong Python. Đó là 50 byte, giả sử rằng chuỗi gốc nằm trong s
và kết quả sẽ kết thúc bằng i
:
n="";i=0
for c in s:
n+=c
try:i=int(n)
except:0
Khá đơn giản, nhưng try
/ except
bit là xấu và dài. Có cách nào để rút ngắn nó?
Chi tiết
Câu trả lời cần phải làm tất cả những điều sau đây:
- Bắt đầu với một chuỗi trong
s
; kết thúc với giá trị nguyên của nó trongi
. - Số nguyên là lần chạy đầu tiên của các chữ số trong chuỗi. Tất cả mọi thứ sau đó được bỏ qua, bao gồm các chữ số khác nếu chúng đến sau các chữ số không.
- Các số 0 đứng đầu trong đầu vào là hợp lệ.
- Bất kỳ chuỗi nào không bắt đầu bằng một số nguyên hợp lệ có giá trị là
0
.
Các tính năng sau được ưa thích , mặc dù không bắt buộc:
- Một
-
dấu hiệu duy nhất ngay trước các chữ số làm cho số nguyên âm. - Bỏ qua khoảng trắng trước và sau số.
- Hoạt động tốt như nhau trong Python 2 hoặc 3.
(Lưu ý: mã của tôi ở trên đáp ứng tất cả các tiêu chí này.)
Các trường hợp thử nghiệm
"0123" -> 123
"123abc" -> 123
"123.45" -> 123
"abc123" -> 0
"-123" -> -123 (or 0 if negatives not handled)
"-1-2" -> -1 (or 0 if negatives not handled)
"--1" -> 0
"" -> 0
"12abc3"
cho cái gì?
12
- tương tự như "123.45"
trường hợp.
(lambda(x)(or(parse-integer x :junk-allowed t)0))
(Lisp chung, 49 byte) - Chỉ được đăng dưới dạng nhận xét vì được tích hợp sẵn.
:junk-allowed
--ha, thật tuyệt! Tôi sẽ làm cho điều này trở thành một thách thức golf chung, vì nó không phải là thực tế rằng câu trả lời trong nhiều ngôn ngữ là tầm thường. Nhưng cảm ơn vì Lisp. : ^)