Project

General

Profile

Feature #18762

Updated by shan (Shannon Skipper) almost 2 years ago

I've found Integer#digits convenient and useful but several times have needed to go from the place-value notation back to an Integer after manipulation and wished there was as a complimentary Array#undigits. 

 ``` ruby 
 class Array 
   def undigits(base = 10) 
     each_with_index.sum do |digit, exponent| 
       digit * base**exponent 
     end 
   end 
 end 

 42.digits.undigits 
 #=> 42 

 42.digits(16).undigits(16) 
 #=> 42 
 ``` 

 Below is my stab at a Ruby implementation with behavior mirroring Integer#digits. 
 ``` ruby 
 class Array 
   def undigits(base = 10) 
     base_int = base.to_int 
     raise TypeError, "wrong argument type #{base_int.class} (expected Integer)" unless base_int.is_a?(Integer) 
     raise ArgumentError, 'negative radix' if base_int.negative? 
     raise ArgumentError, "invalid radix #{base_int}" if base_int < 2 

     each_with_index.sum do |digit, exponent| 
       raise MathDomainError, 'out of domain' if digit.negative? 

       digit * base_int**exponent 
     end 
   end 
 end 
 ``` 

Back