仕様
例えば (1, 1) を A1 に、(2, 26) を Z2 に変換する。
require 'minitest/autorun'
class CellAddressTest < Minitest::Test
def test_to_s
assert_equal('A1', CellAddress.new(row: 1, column: 1).to_s)
assert_equal('Z2', CellAddress.new(row: 2, column: 26).to_s)
assert_equal('AA3', CellAddress.new(row: 3, column: 27).to_s)
assert_equal('AAA100', CellAddress.new(row: 100, column: 703).to_s)
end
end
実装
class CellAddress
ALPHABETS = [*'A'..'Z'].freeze
attr_reader :row_number, :column_number
def initialize(row:, column:)
@row_number = row
@column_number = column
end
def to_s
"#{column_letter}#{row_number}"
end
private
def column_letter
return nil unless column_number > 0
q = column_number
letters = []
until q.zero?
# 商は英語で quotient、余りは remainder というらしい。
q, r = (q - 1).divmod(ALPHABETS.length)
letters.push(ALPHABETS[r])
end
letters.reverse.join
end
end