使用ruby生成用来表示数字的字母?

Rya*_*ery 15 ruby math numerical

我想生成一系列字母,即"A","DE""GJE"等,对应一个数字.前26个很容易,因此3返回"C",26返回"Z",27返回"AA",28"AB",依此类推.

我无法弄清楚的是如何做到这一点,它将处理传入的任何数字.所以如果我传入4123我应该回到3个字母的组合,因为(26*26*26)允许最多+17,000种组合.

有什么建议?

saw*_*awa 13

class Numeric
  Alph = ("a".."z").to_a
  def alph
    s, q = "", self
    (q, r = (q - 1).divmod(26)); s.prepend(Alph[r]) until q.zero?
    s
  end
end

3.alph
# => "c"
26.alph
# => "z"
27.alph
# => "aa"
4123.alph
# => "fbo"
Run Code Online (Sandbox Code Playgroud)

  • 在Rails应用程序中使用此功能的最佳方法是什么?要将类包含在lib目录中并需要它? (2认同)

Dex*_*Dex 12

对@sawa原始回答的问题进行了调整,因为我无法让他按原样运行:

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
Run Code Online (Sandbox Code Playgroud)

在这里它从字符串到整数反向:

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
Run Code Online (Sandbox Code Playgroud)

用法:

1234567890.to_s26 
# => "cywoqvj"

"cywoqvj".to_i26  
# => 1234567890

1234567890.to_s26.to_i26
# => 1234567890

"".to_i26
# => 0

0.to_s26
# => ""
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的收获。我已经更新了答案,所以任何小于1的值都会返回一个空字符串。 (2认同)

ste*_*lag 5

字符串确实有一个succ方法,因此它们可以在Range中使用."Z"的后继者恰好是"AA",所以这有效:

h = {}
('A'..'ZZZ').each_with_index{|w, i| h[i+1] = w } 
p h[27] #=> "AA"
Run Code Online (Sandbox Code Playgroud)