LoginSignup
1
0

More than 3 years have passed since last update.

[Ruby] Excel の行番号と列番号を番地 (A1 など) に変換する

Last updated at Posted at 2019-05-21

仕様

例えば (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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0