2013-12-12 17 views
13

Tôi cần một hàm trả về/in dấu trên số nguyên. Cho đến nay tôi đã đưa ra điều này:Làm thế nào để trích xuất các dấu hiệu của một số nguyên trong Ruby?

def extract_sign(integer) 
    integer >= 0 ? '+' : '-' 
end 

Có phương pháp Ruby cài sẵn không?

+0

Điều đó có vẻ tốt với tôi, nếu 0 nên "+". Nó không thực sự "trích xuất" mặc dù (khi bạn bắt đầu với một số, trong đó dấu hiệu chỉ là một tài sản nội tại của cường độ). – user2864740

Trả lời

35

Đây là một cách đơn giản để làm điều đó:

x = -3 
"++-"[x <=> 0] # => "-" 

x = 0 
"++-"[x <=> 0] # => "+" 

x = 3 
"++-"[x <=> 0] # => "+" 

hoặc

x = -3 
"±+-"[x <=> 0] # => "-" 

x = 0 
"±+-"[x <=> 0] # => "±" 

x = 3 
"±+-"[x <=> 0] # => "+" 
+2

Brilliant :) :) :) –

+2

Đây là một trong những biểu thức ruby ​​thỏa mãn hơn mà tôi từng thấy trong một thời gian dài. Tôi không thể nói rằng nó cũng có tính minh bạch prosaic, nhưng tôi nghĩ rằng nhìn thấy nó dạy những điều quan trọng. –

2

Ruby không có chức năng ký hiệu được tích hợp sẵn như Javascript. Dưới đây là một chuỗi giải thích thêm http://www.ruby-forum.com/topic/141216

Cách tiếp cận của bạn có vẻ chính xác.

2
class Numeric 
    def sign 
    if self > 0 
     '+' 
    elsif zero? 
     nil 
    else 
     '-' 
    end 
    end 
end 
+0

Bạn cũng có thể thấy nếu một cái gì đó bằng với giá trị tuyệt đối của nó - nhưng sau đó bạn sẽ phải trả tiền cho phép tính đó. –

+0

Bạn cần từ khóa 'class' và không phải là đối tượng' Class', là tên của lớp Class. –

+0

Không ... Tôi cần kiểm tra tính năng tự động viết hoa ở dòng bắt đầu :) –

4

Bạn có thể sử dụng Kernel#sprintf đến các số định dạng:

def sign(i) 
    sprintf("%+d", i)[0] 
end 

sign(100) #=> "+" 
sign(-100) #=> "-" 
7

Tôi nghĩ rằng đó là vô nghĩa không có phương pháp tha t chỉ cho -1 hoặc +1. Ngay cả BASIC cũng có một hàm SGN (n). Tại sao chúng ta phải đối phó với Strings khi đó là số chúng ta muốn làm việc. Nhưng đó chỉ là MHO.

def sgn(n) 
    n <=> 0 
end. 
0

tôi sử dụng n == 0 ? 1 : n.abs/n, ví dụ .:

def sign(n) 
    n == 0 ? 1 : n.abs/n 
end 

sign(10) # 1 
sign(0) # 1 
sign(-5) # -1 
+0

Không nên 'ký (0)' trả về 0? – swdev

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