Generate letters to represent number using ruby?

后端 未结 8 1720
你的背包
你的背包 2020-12-24 15:00

I would like to generate a sequence of letters i.e. \"A\", \"DE\" \"GJE\", etc. that correspond to a number. The first 26 are pretty easy so 3 returns \"C\", 26 returns \"Z\

8条回答
  •  不思量自难忘°
    2020-12-24 15:18

    A tweak on @sawa original answer for Ruby 2.0 since I couldn't get his to work as is:

    class Numeric
      Alpha26 = ("a".."z").to_a
      def to_s26
        return "" if self < 1
        s, q = "", self
        loop do
          q, r = (q - 1).divmod(26)
          s.prepend(Alpha26[r]) 
          break if q.zero?
        end
        s
      end
    end
    

    and here it is going in reverse from string to integer:

    class String
      Alpha26 = ("a".."z").to_a
    
      def to_i26
        result = 0
        downcased = downcase
        (1..length).each do |i|
          char = downcased[-i]
          result += 26**(i-1) * (Alpha26.index(char) + 1)
        end
        result
      end
    
    end
    

    Usage:

    1234567890.to_s26 
    # => "cywoqvj"
    
    "cywoqvj".to_i26  
    # => 1234567890
    
    1234567890.to_s26.to_i26
    # => 1234567890
    
    "".to_i26
    # => 0
    
    0.to_s26
    # => ""
    

提交回复
热议问题