2011-03-21 30 views
12

Đây là câu hỏi cực kỳ mới của người mới.lấy từng số riêng lẻ từ một số nguyên Fixnum Ruby on Rails

Tôi có tuổi được lưu trữ trong cơ sở dữ liệu.

Khi tôi lấy tuổi từ cơ sở dữ liệu, tôi muốn nhận từng chữ số riêng lẻ.

Ví dụ:

User.age = 25 

Tôi muốn nhận được như sau:

first = 5 
second = 2 

tôi dường như không thể vật lộn này từ các dữ liệu như nó một sửa chữa num.

Bất kỳ ai cũng biết một giải pháp đơn giản và sạch sẽ.

Trả lời

19

Bạn có thể chuyển đổi thành chuỗi và sau đó chia thành các chữ số, ví dụ:

first, second = User.age.to_s.split('') 
=> ["2", "5"] 

Nếu bạn cần các chữ số riêng lẻ dưới dạng Fixnums bạn có thể ánh xạ lại, ví dụ:

first, second = User.age.to_s.split('').map { |digit| digit.to_i } 
=> [2, 5] 

Hoặc, bạn có thể sử dụng phân chia số nguyên ví dụ:

first, second = User.age.div(10), User.age % 10 
=> [2, 5] 

Lưu ý rằng các ví dụ trên đang sử dụng parallel assignment mà bạn có thể chưa gặp phải nếu bạn mới dùng Ruby.

+4

'bản đồ {| chữ số | digit.to_i} 'shortcut =>' map (&: to_i) ' – fl00r

+2

Ngoài ra:' n.to_s.chars.map (&: to_i) '. – tokland

3

http://www.ruby-doc.org/core/classes/String.html#M001210

25.to_s.each_char {|c| print c, ' ' } 

công cụ này là rất dễ dàng để tìm thấy thông qua tài liệu Ruby.

+0

Tôi đã chuyển đổi thành một chuỗi và sau đó sử dụng chuỗi [0] .chr. Tôi nghĩ rằng phải có một cách tốt hơn. Đó divmod (10) là khá mát mẻ và nhỏ gọn. – chell

7
first, last = User.age.divmod(10) 
+0

tuyệt. không bao giờ nghe nói về 'divmod' :) – fl00r

+1

điều này không trả về chữ số đầu tiên nếu người dùng có ba chữ số – Zippie

1

Không phải là giải pháp tốt nhất, nhưng chỉ dành riêng cho bộ sưu tập:

User.age.chars.to_a.map(&:to_i) 
#=> [5, 2] 
first, second = User.age.chars.to_a.map(&:to_i) 
3

Kiểm tra tiêu chuẩn cho rất nhiều các giải pháp ở đây: http://gistflow.com/posts/873-integer-to-array-of-digits-with-ruby Tốt nhất là sử dụng divmod trong một vòng lặp:

def digits(base) 
    digits = [] 

    while base != 0 do 
    base, last_digit = base.divmod(10) 
    digits << last_digit 
    end 

    digits.reverse 
end 
+0

Đẹp, nhưng như một phương pháp chung, điều này có một lỗ hổng: Nó sẽ trả về' [] 'cho' 0' . Điều này có thể được sửa bằng cách thay thế 'while base! = 0' bằng' loop' và thêm 'return digits.reverse nếu base == 0' vào cuối vòng lặp đó, thay vì giá trị trả về nằm ngoài vòng lặp. Tuy nhiên nó sẽ vẫn lặp vô hạn cho các số âm. – daniero

2

Ruby 2.4 có phương thức Integer#digits. ví dụ:

25.digits 
# => [5, 2] 

Vì vậy, bạn có thể làm

first, second = user.age.digits 
Các vấn đề liên quan