จะตรวจสอบได้อย่างไรว่าตัวเลขรวมอยู่ในช่วง (ในคำสั่งเดียว) หรือไม่?


86

ฉันใช้ Ruby บน Rails 3.0.9 และฉันต้องการตรวจสอบว่ามีตัวเลขรวมอยู่ในช่วงหรือไม่ นั่นคือถ้าฉันมีตัวแปรnumber = 5ฉันต้องการตรวจสอบ1 <= number <= 10และดึงค่าบูลีนหากnumberค่านั้นรวมอยู่ในช่วงนั้น

ฉันทำได้ดังนี้:

number >= 1 && number <= 10

แต่ฉันอยากจะทำในคำสั่งเดียว ฉันจะทำเช่นนั้นได้อย่างไร?


เนื่องจากไม่มีอะไรผิดปกติกับข้อความที่คุณอ้างถึงจึงทำให้เกิดคำถาม: ทำไมคุณต้องการ / ต้อง "ย่อ" เพิ่มเติม
DarkDust

1
@DarkDust - โค้ดน้อยที่สุดเท่าที่จะทำได้!
Backo

คำตอบ:


163

(1..10).include?(number) คือเคล็ดลับ

Btw: หากคุณต้องการตรวจสอบหมายเลขโดยใช้ActiveModel::Validationsคุณสามารถทำได้:

validates_inclusion_of :number, :in => 1..10

อ่านที่นี่เกี่ยวกับ validates_inclusion_of

หรือทาง Rails 3+:

validates :number, :inclusion => 1..10

จะทำอย่างไรถ้าฉันต้องการอนุญาตศูนย์? ฉันได้รับข้อผิดพลาดเมื่อไม่มี
user2503775

5
allow_nilทางรถไฟมีตัวเลือก เพียงแค่เพิ่มมัน:, allow_nil: true
Mario Uher

65

นับได้ # ได้แก่ ? :

(1..10).include? n

ช่วง # ปก? :

(1..10).cover? n

เทียบเคียง # ระหว่าง? :

n.between? 1, 10

ตัวตรวจสอบตัวเลข :

validates :n, numericality: {only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 10}

เครื่องมือตรวจสอบการรวม :

validates :n, inclusion: 1..10

1
ฉันชอบวิธีนี้มากกว่าเพราะข้อความตรวจสอบความถูกต้องเหมาะสมกว่า
Dan

ฉันชอบมันมากกว่าเพราะฉันเป็นตัวเลขที่ตรวจสอบความถูกต้องอยู่แล้ว ทำให้เป็นบรรทัดเดียว :)
BradGreens

@BradGreens นั่นยาวหนึ่งบรรทัด
wchargin

1
ฉันต้องการทราบว่าคุณสามารถใช้ proc ได้หากคุณต้องการตรรกะเฉพาะบางอย่างหรือการเข้าถึงการเชื่อมโยง ตัวอย่างเช่นvalidates :amount, numericality: { less_than_or_equal_to: ->(m) { m.user.balance }, greater_than_or_equal_to: 0 }
ЕвгенийМасленков

16

หากไม่ใช่ส่วนหนึ่งของกระบวนการตรวจสอบความถูกต้องคุณสามารถใช้#between?:

2.between?(1, 4)
=> true

7

สำหรับข้อความแสดงข้อผิดพลาดที่ถูกต้องในการส่งแบบฟอร์มให้ลองใช้สิ่งเหล่านี้

validates_numericality_of :tax_rate, greater_than_or_equal_to: 0, less_than_or_equal_to: 100, message: 'must be between 0 & 100'

3

ราง 4

หากคุณต้องการผ่าน ActiveModel :: Validations คุณสามารถใช้ได้

validates_inclusion_of :number, :in => start_number..end_number

หรือไวยากรณ์ Rails 3

validates :number, :inclusion => start_number..end_number

แต่วิธีที่ง่ายที่สุดที่ฉันพบคือ

number.between? start_number, end_number


อาจรวมคำอธิบายไว้ด้วย
GMchris

2

ใน Ruby 1.9 คำแปลที่ตรงที่สุดน่าจะเป็นRange # cover? :

ส่งคืนค่าจริงถ้า obj อยู่ระหว่าง beg และ end เช่น beg <= obj <= end (หรือจบเฉพาะเมื่อ exclude_end? เป็นจริง)

ในกรณีที่คุณสงสัยว่ามันแตกต่างจากRange#include?อย่างไรมันจะวนซ้ำในองค์ประกอบทั้งหมดของช่วงถ้าเป็นช่วงที่ไม่ใช่ตัวเลข ดูโพสต์บล็อกนี้สำหรับคำอธิบายโดยละเอียดเพิ่มเติม


1

หากคุณต้องการตรวจสอบหมายเลขเฉพาะที่มีอยู่ในอาร์เรย์ที่กำหนดเอง

ตัวอย่างเช่นฉันต้องการทราบว่า 5 รวมอยู่ใน list = [1,4,6,10] หรือไม่

list.include? 5 => false
list.include? 6 => true
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.