값이 숫자인지 어떻게 확인할 수 있습니까?


82

양식 텍스트 필드에서 반환 된 값이 숫자 즉, 12, 12.5 또는 12.75인지 확인하고 싶습니다. 이를 확인하는 간단한 방법이 param있습니까? 특히 값이 ?


음, 유일한 것은 코드가 is_a_number에 대해 작동한다는 것입니다. .02 또는 .3 숫자 만 예외로 작동합니다 ....
user211662

7
저는이 솔루션을 훨씬 선호합니다 : stackoverflow.com/questions/5661466/… 왜 그렇게 많은 사람들이 정규 표현식이 더 좋을 것이라고 생각하는지 모르겠습니다.
2called-chaos 2013-09-17

답변:


26

그냥 regexp, 사소하고 그 이상으로 생각할 가치가 없습니다.

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

(Justin의 의견에 따라 수정 됨)


5
루비에서 ^ 및 $는 문자열이 아닌 줄의 시작 / 끝을 나타냅니다. 이것은 입력을 삭제하는 수단으로 사용하는 데 비효율적입니다 ( guides.rubyonrails.org/security.html#regular-expressions 참조 ). 더 나은 접근 방식은 다음과 같습니다 v.to_s =~ /\A[-+]?\d*\.?\d+\z/.
Justin

204

당신이 사용할 수있는

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).


죄송합니다, 이것은 기본적으로, 난 그냥 0.03, 0.3, 2.2 뒤의 두 작품이든 사용자로부터 어떤 입력을 평가 할 수 있도록하려면,하지만 난 첫 번째 입력 작업을 얻을 필요가 ... 루비 레일에 있습니다 : S를
user211662

10
Fixnum수레와 함께 작동하지 않는 것 같습니다. 그러나 Numeric잘 작동합니다. 그래서 1.234.is_a? Fixnum == false,하지만 1.234.is_a? Numeric == true.
KurtPreston 2011

이것은 수레에서는 작동하지 않습니다. 사용해야 1.1.is_a? Numeric참조 stackoverflow.com/a/17668654/76486
브라이언 암스트롱

1
:( 나를 위해 작동하지 않습니다pry(main)> '12'.is_a? Numeric => false
살릴

@Salil은 분명히 당신을 위해 작동하지 않을 것입니다 '12'. 이 경우 Regex 또는 다른 가능한 솔루션으로 문자열을 확인하십시오.
edmundo096

27

요즘은 보통 Integer와 Float 만 사용합니다.

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


7

문자열을 두 번 변환하십시오.

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

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

정수로 그렇게 나쁘지는 않지만 float로이 조언을 따르고 싶다면 실패 할 수있는 방법이 너무 많습니다 (질문이 묻는 것입니다) : "7" == "7".to_f.to_s #=> false( "7"vs "7.0")
David Stosik

당신은 할 수 있습니다num == num.to_i.to_s || num == num.to_f.to_s
mannykary

당신은 또한 보장에 "%"연산자를 사용하여 두 문자열을 포맷 할 수 있습니다 그들이 동일한 문자열 모두 끝
Jaacko 원환

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

4
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

6
"1.1".is_a? 숫자 => false
Waclock 16.09.13

문자열 변환 문제를 어떻게 해결 하시겠습니까? OP는 텍스트 필드에서 가져온 것이라고 말합니다.
schlingel 2016

-5

문자열 값은 항상 .to_i를 사용하여 0으로 변환됩니다.

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

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

엣지 케이스는 어떻습니까? 숫자가 0이거나 음수이면 테스트에서 위음성을 제공합니다.
tsikov 2015 년

더 나쁜 '1AB2'.to_i는 ... 분명히 정수가 아닌 무언가를 위해 1을 반환
토마스 Bindzus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.