Tôi có một giá trị băm ngẫu nhiên, có thể có các giá trị như "100"
, mà tôi muốn chuyển đổi thành số nguyên. Tôi biết tôi có thể làm điều này bằng cách sử dụng value.to_i if value.to_i.to_s == value
, nhưng tôi không chắc chắn làm thế nào tôi sẽ làm điều đó đệ quy trong băm của tôi, xem xét rằng một giá trị có thể là một chuỗi, hoặc một mảng (của băm hoặc chuỗi), hoặc băm khác.Chuyển đổi đệ quy tất cả chuỗi số thành số nguyên trong mã băm Ruby
Trả lời
Đây là một triển khai đệ quy khá đơn giản (mặc dù phải xử lý cả mảng và băm bổ sung thêm một chút khéo léo).
def fixnumify obj
if obj.respond_to? :to_i
# If we can cast it to a Fixnum, do it.
obj.to_i
elsif obj.is_a? Array
# If it's an Array, use Enumerable#map to recursively call this method
# on each item.
obj.map {|item| fixnumify item }
elsif obj.is_a? Hash
# If it's a Hash, recursively call this method on each value.
obj.merge(obj) {|k, val| fixnumify val }
else
# If for some reason we run into something else, just return
# it unmodified; alternatively you could throw an exception.
obj
end
end
Và, hey, nó thậm chí hoạt động:
hsh = { :a => '1',
:b => '2',
:c => { :d => '3',
:e => [ 4, '5', { :f => '6' } ]
},
:g => 7,
:h => [],
:i => {}
}
fixnumify hsh
# => {:a=>1, :b=>2, :c=>{:d=>3, :e=>[4, 5, {:f=>6}]}, :g=>7, :h=>[], :i=>{}}
Cảm ơn, điều đó hoạt động. Tuy nhiên, tôi phải thay đổi đầu tiên nếu thành 'if obj.respond_to? : to_i và obj.to_i.to_s == obj' vì băm của tôi cũng có thể chứa các chuỗi chữ cái. Bạn có thể chỉnh sửa câu trả lời cho phù hợp. Cảm ơn một lần nữa! –
'obj.merge (obj) {| k, val | fixnumify val} '=>' Hash [obj.map {| k, v | [k, fixnumify (val)] '? Chỉ cần có linh cảm thì nó có thể nhanh hơn. –
Đó có thể là, @VictorMoroz, mặc dù tôi chỉ đoán từng bước một. Tôi luôn luôn quên về 'Hash []'. Cảm ơn! –
Đây là lớp helper của tôi. Nó chỉ chuyển đổi các chuỗi chỉ là số (Integer hoặc Float).
module Helpers
class Number
class << self
def convert(object)
case object
when String
begin
numeric(object)
rescue StandardError
object
end
when Array
object.map { |i| convert i }
when Hash
object.merge(object) { |_k, v| convert v }
else
object
end
end # convert
private
def numeric(object)
Integer(object)
rescue
Float(object)
end # numeric
end # << self
end # Number
end # Helpers
Helpers::Number.convert [{a: ["1", "22sd"]}, 2, ['1.3', {b: "c"}]]
#=> [{:a=>[1, "22sd"]}, 2, [1.3, {:b=>"c"}]]
- 1. Ruby - Chuyển đổi số nguyên thành chuỗi
- 2. Chuyển đổi số nguyên thành chuỗi
- 3. Python: Chuyển đổi chuỗi thành số nguyên
- 4. Chuyển đổi chuỗi chuỗi thành số nguyên (Clojure)
- 5. Rails Di chuyển để chuyển đổi chuỗi thành số nguyên?
- 6. Chuyển đổi chuỗi có chứa một số thành số nguyên
- 7. Chuyển đổi thành vòng lặp ... đệ quy đệ quy
- 8. Cách chuyển đổi chuỗi thành số nguyên trong h: selectOneMenu
- 9. chuyển chuỗi thành số nguyên trong C++
- 10. Chuyển chuỗi thành số nguyên
- 11. Chuyển đổi các khóa băm thành chữ thường - Mã số Ruby
- 12. Chuyển đổi số được viết thành từ thành số nguyên?
- 13. Cách chuyển đổi chuỗi thành số nguyên trong UNIX
- 14. Chuyển đổi chuỗi thành số nguyên trong XSLT 1.0
- 15. Chuyển đổi chuỗi thành số nguyên/phao trong Haskell?
- 16. chuyển đổi một số nguyên thành chuỗi trong Erlang
- 17. Chuyển đổi băm để chuỗi trong Ruby
- 18. JSON JSON chuyển đổi số nguyên thành chuỗi
- 19. Chuyển đổi một số nguyên thành chuỗi thập lục phân trong Ruby
- 20. Làm thế nào để chuyển đổi một chuỗi hoặc số nguyên thành nhị phân trong Ruby?
- 21. Chuyển đổi chuỗi thành số nguyên trên Android
- 22. Nhận chìa khóa băm và chuyển đổi thành chuỗi ruby
- 23. Java Chuyển đổi số nguyên thành số nguyên hex
- 24. Chuyển chuỗi thành số thập phân trong ruby
- 25. Chuyển đổi chuỗi nhị phân thành số nguyên
- 26. SQL Server Chuyển đổi số nguyên thành chuỗi nhị phân
- 27. chuyển đổi một số nguyên thành chuỗi as3
- 28. Chuyển đổi chuỗi bằng dấu phẩy thành số nguyên
- 29. chuyển đổi danh sách chuỗi thành danh sách số nguyên
- 30. groovy chuyển đổi Chuỗi "1,503" thành Số nguyên
bài viết một ví dụ –
Ngoài ra, câu trả lời cho câu hỏi của bạn: sử dụng đệ quy với '#is_kind_of ' –
' obj.to_i.to_s == obj' có vẻ kỳ lạ?. Có thể có các biểu diễn chuỗi khác nhau cho cùng một giá trị số nguyên, ví dụ: "1_000_000" hoặc "019". –