2013-12-12 1 views
13

Ho bisogno di una funzione che restituisca/stampi il segno su un numero intero. Finora mi è venuta questa idea:Come estrarre il segno di un intero in Ruby?

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

Esiste un metodo Ruby incorporato che lo fa?

+0

Che guarda bene a me, se 0 dovrebbe essere "+". Non è davvero "estratto" (dato che inizi con un numero, di cui il segno è solo una proprietà intrinseca della grandezza). – user2864740

risposta

35

Ecco un modo semplice per farlo:

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

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

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

o

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

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

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

Brilliant :) :) :) –

+2

Questa è una delle espressioni ruby ​​più soddisfacenti che ho visto da molto tempo. Non posso dire che abbia anche una trasparenza prosaica, ma penso che vederlo insegna cose importanti. –

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

Si potrebbe anche vedere se qualcosa è uguale al suo valore assoluto - ma allora si dovrebbe pagare per quel calcolo. –

+0

Avete bisogno della parola chiave 'class' e non del contant di' Class' che è il nome della classe Class. –

+0

No ... Devo controllare l'auto-capitalizzazione automatica all'inizio della riga :) –

4

Potreste usare Kernel#sprintf per formattare i numeri:

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

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

penso che sia sciocchezze per non avere un metodo tha t dà solo -1 o +1. Anche BASIC ha una tale funzione SGN (n). Perché dovremmo avere a che fare con le stringhe quando sono i numeri con cui vogliamo lavorare. Ma questo è solo MHO.

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

Io uso n == 0 ? 1 : n.abs/n, ad es .:

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

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

Non dovrebbe 'segno (0)' restituire 0? – swdev