Czy Rails 3 lub Ruby mają wbudowany sposób sprawdzania, czy zmienna jest liczbą całkowitą?
Na przykład,
1.is_an_int #=> true
"[email protected]".is_an_int #=> false?
ruby
ruby-on-rails-3
Uczeń
źródło
źródło
to_i
. To część "kaczego pisania" Rubiego: jeśli może zachowywać się jak liczba całkowita, traktuj ją jak jedną.kind_of?
to alias dois_a?
.is_a?
jest nieco inny; pyta, czy obiekt instancji określonej klasy;kind_of?
pyta, czy jest to instancja lub dziecko określonej klasy.fido.is_a? Dog
jest prawdziwy;fido.kind_of? Animal
jest na przykład prawdą.Odpowiedzi:
Możesz użyć
is_a?
metodyźródło
Integer(obj) rescue false
To nie zadziała dla "1", jeśli chcesz sprawdzić, czy nastąpi konwersjaJeśli chcesz wiedzieć, czy obiekt jest
Integer
lub czymś, co można w znaczący sposób przekonwertować na liczbę całkowitą (NIE obejmuje rzeczy takich jak"hello"
, któreto_i
zostaną przekonwertowane na0
):źródło
Integer(2.5) => 2
zawsze jest to znacząca konwersja.Użyj wyrażenia regularnego w ciągu:
Jeśli chcesz sprawdzić, czy zmienna jest określonego typu, możesz po prostu użyć
kind_of?
:źródło
\d+?
specyfikacji?
określa niechciane dopasowanie, podczas gdy prawdopodobnie chcesz opcjonalnego dopasowania. Zmiana\d+?
na\d*
może to naprawić, ale chciałbym przeprowadzić go przez zestaw testów, aby się upewnić. To również nie będzie pasowało do notacji szesnastkowej lub wykładniczej, ale jestem pewien, że jest to dobre w niektórych przypadkach użycia.\A\d+\z
?Integer(obj) rescue false
kodem z @ alex-d poniżej; wyrażenie regularne jest trudne do odczytania i nie jest jasne w swoim celu. Obie prace, doszedłem do tego pytania, próbując naprawić źle skonstruowane wyrażenie regularne, które nie zawsze działało :-)Jeśli nie masz pewności co do typu zmiennej (może to być ciąg znaków liczbowych), powiedz, że był to numer karty kredytowej przekazany do parametrów, więc pierwotnie byłby to ciąg, ale chcesz się upewnić, że tak nie jest nie zawiera żadnych liter, użyłbym tej metody:
@Benny zwraca uwagę na przeoczenie tej metody, pamiętaj o tym:
źródło
obj.to_s == obj.to_f.to_s
tak jak w moim przypadku.Możesz użyć Triple Equal.
źródło
Jest
var.is_a? Class
(w twoim przypadkuvar.is_a? Integer
:); to mogłoby pasować do rachunku. Lub jestInteger(var)
, gdzie zgłosi wyjątek, jeśli nie może go przeanalizować.źródło
Bardziej „kaczkowate” sposobem jest użycie w
respond_to?
ten sposób klas typu „integer-like” lub „string-like”źródło
W przypadku, gdy nie trzeba konwertować wartości zerowe, znaleźć sposoby
to_i
ito_f
być bardzo przydatna, ponieważ będą one przekształcić łańcuch albo do wartości zerowej (jeśli nie jest zamienny lub zerowy) lub rzeczywisteInteger
lubFloat
wartości.EDIT2: uważaj,
0
wartość całkowita nie jest błędna, to prawda (!!0 #=> true
) (dzięki @prettycoder)EDYTOWAĆ
Ach, właśnie dowiedziałem się o ciemnych przypadkach ... wydaje się, że dzieje się to tylko wtedy, gdy liczba jest na pierwszym miejscu
źródło
Aby wykorzystać odpowiedź Alexa D , używając zawężeń :
Później w Twojej klasie:
źródło
Miałem podobny problem, zanim spróbowałem określić, czy coś jest ciągiem znaków lub jakąkolwiek liczbą. Próbowałem użyć wyrażenia regularnego, ale nie jest to wiarygodne w moim przypadku użycia. Zamiast tego możesz sprawdzić klasę zmiennej, aby zobaczyć, czy jest ona potomkiem klasy Numeric.
W tej sytuacji możesz również podstawić dowolny z potomków Numeric: BigDecimal, Date :: Infinity, Integer, Fixnum, Float, Bignum, Rational, Complex
źródło
Prawdopodobnie szukasz czegoś takiego:
Zaakceptuj „2.0 lub 2.0” jako INT, ale odrzuć 2.1 i 2.1
źródło