2010-01-19 14 views
64

양식 텍스트 필드의 반환 값이 숫자 (예 : 12, 12.5 또는 12.75)인지 단순히 확인하고 싶습니다. 이 값을 확인하는 간단한 방법이 있습니까? 특히 값이 param으로 표시되는 경우?값이 숫자인지 어떻게 확인할 수 있습니까?

+0

음, 유일한 코드가 is_a_number 작동한다는 것입니다? 유일한 예외 인 .02 또는 .3 숫자로 작동합니다. – user211662

+5

나는이 솔루션을 더 선호합니다. http://stackoverflow.com/questions/5661466/test-if-string-is-a-number-in- ruby-on-rails/5661695 나는 왜 그렇게 많은 사람들이 정규 표현식이 더 좋을 것이라고 생각하는지 모르겠습니다. –

답변

20

그냥 정규 표현식은, 그것은 그 이상에 대해 생각 가치가 사소한, 그리고 아니다 :

v =~ /\A[-+]?[0-9]*\.?[0-9]+\Z/ 

+5

루비에서^및 $는 문자열이 아닌 줄의 시작/끝을 나타냅니다. 이는 입력을 위생 처리하는 수단으로 사용하는 것이 비효율적입니다 (http://guides.rubyonrails.org/security.html#regular-expressions 참조). 보다 나은 접근 방법은 'v.to_s = ~/\ A [- +]? \ d * \.? \ d + \ z /'입니다. – Justin

+10

그건 사소한 것이 아니라, 그렇게 경험이없는 사람을 생각해보십시오! –

152

당신은

12.is_a? Numeric 

(Numeric 정수와 수레를 위해 작동합니다.)를 사용할 수 있습니다

을 유효한 숫자의 표현을 포함 할 수있는 문자열로 도착하면, 당신은 사용할 수

class String 
    def valid_float? 
    true if Float self rescue false 
    end 
end 

그리고 '12'.valid_float?은 문자열을 유효한 float로 변환 할 수 있으면 true를 반환합니다 (예 : to_f).

+4

제목을 기반으로 루비 (레일이 아님)에 대한 것입니다 ... – Peter

+0

죄송합니다, 이것은 Ruby on Rails ... 기본적으로, 나는 사용자의 입력을 평가할 수 있기를 원합니다. 03 0.3, 2.2 두 번째 작업은 작동하지만 첫 입력 작업을해야합니다. S – user211662

+10

'''Fixnum'''은 부동 소수점으로 작동하지 않습니다. 그러나''숫자 형''은 잘 작동한다. 그래서'''1.234.is_a? Fixnum == false''', 그러나'''1.234.is_a? 숫자 == 참'''. – KurtPreston

5

(저스틴의 의견에 따라 고정) 나는이 하나

제안
def is_number? 
    self.to_f == self 
end 

> 15.is_number? 
=> true 
> 15.0.is_number? 
=> true 
> 'Not a number'.is_number? 
=> false 
> (0/0.0).is_number? 
=> false 
+0

Float :: INFINITY –

20

나는 보통 정수와 플로트를 사용합니다.

1.9.2p320 :001 > foo = "343" 
=> "343" 
1.9.2p320 :003 > goo = "fg5" 
=> "fg5" 

1.9.2p320 :002 > Integer(foo) rescue nil 
=> 343 
1.9.2p320 :004 > Integer(goo) rescue nil 
=> nil 

1.9.2p320 :005 > Float(foo) rescue nil 
=> 343.0 
1.9.2p320 :006 > Float(goo) rescue nil 
=> nil 
6
irb(main):005:0> 1.1.is_a? Numeric 
=> true 
irb(main):006:0> 1.is_a? Numeric 
=> true 
irb(main):007:0> 'asd'.is_a? Numeric 
=> false 
+5

"1.1".is_a에 작동하지 않습니다? 숫자 => 거짓 – Waclock

+0

문자열 변환 문제를 어떻게 해결할 수 있습니까? OP는 텍스트 필드에서 온다고 말합니다. – schlingel

-3

문자열 값은 항상 그냥 두 번 문자열을 변환 .to_i

[14] pry(main)> 'Apple'.to_i > 0 
=> false 

[15] pry(main)> '101'.to_i > 0 
=> true 
+0

가장자리 케이스는 어떻습니까? 숫자가 0이거나 음수이면 테스트에서 거짓 음성이 표시됩니다. – tsikov

+0

더 나쁜 '1AB2'.to_i는 분명히 정수가 아닌 것 때문에 1을 반환 할 것입니다. –

5

과 0으로 변환 :

num = '12' 
num == num.to_i.to_s 
#=> true 

num = '3re' 
num == num.to_i.to_s 
#=> false 
+0

정수에서는 그렇게 나쁘지 않습니다.하지만이 조언을 따르기를 원한다면 실패 할 수있는 방법이 많이 있습니다. 질문에 대해 묻는 것) : ' "7"== "7".to_f.to_s # => false' ("7"vs "7.0") –

관련 문제