2012-04-26 36 views
5

Có phương thức Ruby lấy chuỗi và giá trị mặc định và chuyển đổi thành số nguyên nếu chuỗi biểu thị số nguyên hoặc trả về giá trị mặc định khác không?Chuyển đổi chuỗi Ruby thành số nguyên với giá trị mặc định

cập nhật Tôi nghĩ câu trả lời sau đây là một lợi thế:

class String 
    def try_to_i(default = nil) 
    /^\d+$/ === self ? to_i : default 
    end 
end 

Đây là bằng chứng cho lý do tại sao bạn nên tránh trường hợp ngoại lệ:

> def time; t = Time.now; yield; Time.now - t end 

> time { 1000000.times { |i| ('_' << i.to_s) =~ /\d+/ } } 
=> 1.3491532 
> time { 1000000.times { |i| Integer.new('_' << i.to_s) rescue nil } } 
=> 27.190596426 
+0

Bạn có ý nghĩa gì bởi "chứa số nguyên"? –

+0

'" tối ưu hóa sớm là gốc rễ của tất cả các điều ác "' - Donald Knuth – Reactormonk

Trả lời

2

Bạn sẽ phải viết mã mà bản thân, có thể sử dụng một biểu thức chính quy để kiểm tra chuỗi:

def try_to_i(str, default = nil) 
    str =~ /^-?\d+$/ ? str.to_i : default 
end 
+0

Điều gì về số âm? – Reactormonk

+0

@Tass: Cảm ơn bạn đã chỉ ra điều đó :) –

8

#to_iInteger() để chuyển đổi. Đầu tiên có một mặc định là 0, cái thứ hai làm tăng một ArgumentError.

class String 
    def to_integer(default) 
    Integer(self) 
    rescue ArgumentError 
    default 
    end 
end 
+0

Tôi nghĩ rằng việc sử dụng trường hợp ngoại lệ đối với trường hợp sử dụng bình thường là chi phí quá cao hiệu suất – Alexey

+0

Tôi phải đồng ý rằng đây là giải pháp thanh lịch hơn và phải được chấp nhận. Tôi chỉ không đề nghị điều này bởi vì tôi không biết về 'Integer()'. @ Alexey: Chi phí sử dụng một regex cho công việc thậm chí còn có vấn đề hơn. –

+0

Niklas, xem cập nhật trong câu hỏi – Alexey

-1

Bạn có thể làm một cái gì đó như thế này:

int_value = (stringVar.match(/^(\d+)$/) && $1.to_i) || default_value 

Đó sẽ thấy nếu chuỗi được cấu tạo hoàn toàn các chữ số, và nếu như vậy, chuyển đổi sang int, hoặc trả lại giá trị mặc định của bạn.

+0

Ruby có '?:', Vậy tại sao sử dụng '&& ... || không đáng tin cậy ... 'thành ngữ? –

+0

IMO, có vẻ như âm thanh khái niệm hơn để gộp trường hợp nguyên vào một khối cha, thay vì sử dụng toán tử bậc ba. Ngoài ra, cách &&/|| không đáng tin cậy? Chắc chắn, có vấn đề ưu tiên nếu bạn chuyển đổi giữa các toán tử tương đương bằng văn bản (hoặc/và), nhưng việc sử dụng nhất quán sẽ loại bỏ điều đó. Tất cả những gì đã nói, đó là tùy thuộc vào bạn - nếu ternary phù hợp với phong cách của bạn, đi cho nó. –

+0

Tôi có nghĩa là bạn luôn phải suy nghĩ hai lần nếu phần giữa '&&' và '||' có thể trở thành 'false' hoặc' nil', trong trường hợp nó không tương đương với toán tử điều kiện hoặc 'if .. sau đó .. else'. Trong trường hợp này thì không sao vì 'to_i' luôn trả về một giá trị số nguyên. BTW, dấu ngoặc đơn không cần thiết trong ví dụ của bạn. –

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