Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.91 KB | None | 0 0
  1. class String # :nodoc:
  2. def valid_rut?(out: {})
  3. splitted = strip.split('-')
  4. rut = splitted.first.delete('.').to_i
  5. dv = rut.dv
  6. valid = dv == splitted.last.upcase
  7.  
  8. if valid
  9. out[:rut] = rut
  10. out[:dv] = dv
  11. out[:formatted] = rut.to_formatted_rut
  12. end
  13.  
  14. valid
  15. rescue StandardError
  16. false
  17. end
  18. end
  19.  
  20. class Numeric # :nodoc:
  21. def dv
  22. reversed_digits = to_s.reverse.chars.map(&:to_i)
  23. factors = (2..7).to_a.cycle
  24. sum = reversed_digits.zip(factors).inject(0) { |s, (d, f)| s + d * f }
  25. (-sum) % 11 == 10 ? 'K' : ((-sum) % 11).to_s
  26. end
  27.  
  28. def to_rut
  29. [to_s, dv].join('-')
  30. end
  31.  
  32. def to_formatted_rut
  33. [to_s.reverse.gsub(/...(?=.)/, '\&.').reverse, dv].join('-')
  34. end
  35. end
  36.  
  37. # Ejemplo de uso:
  38. #
  39. # 12345678.to_formatted_rut
  40. # => "12.345.678-5"
  41. #
  42. # out = {}; "12.345.678-5".valid_rut?(out: out)
  43. # => true
  44. #
  45. # out
  46. # => {:rut=>12345678, :dv=>"5", :formatted=>"12.345.678-5"}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement