スプレッドシートの列を表すラベルと列数を相互に変換するコードを考える
スプレッドシートの列はA、B、...、Z、AA、...のようなラベルがある。
このA-Z世界は通常のn進数と少し異なる。
通常のn進数でいう0をA-Z世界のAに対応させるとAAは00と書くようなもので、スプレッドシートの列と合わない。
次にAを1に対応させると0の役目がなくなって繰り上がりに不都合が生じる…
思ったより面倒な世界だw
スマートなコードを心がけたが、こんなものだろうか? うーん…
column_labels = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
def label2num(label):
label = label.upper()
s = 0
#for i in range(len(label)): s += ( column_labels.index(label[i]) + 1 ) * len(column_labels) ** ( len(label) - 1 - i )
for i in range(len(label)): s = s * len(column_labels) + column_labels.index(label[i]) + 1
return s
def num2label(num):
s = ''
while num > 0:
c = ( num - 1 ) % len(column_labels)
s = column_labels[c] + s
num = int( ( num - 1 ) / len(column_labels) )
return s
if __name__ == '__main__':
import sys
label = sys.argv[1]
if label == '-debug':
MAX_COUNT = 100000
print('[INFO] Debug mode is counting up to {}.'.format(MAX_COUNT))
for num1 in range(1,MAX_COUNT):
label1 = num2label(num1)
num2 = label2num(label1)
label2 = num2label(num2)
if num1 != num2 or label1 != label2: print(num1, num2, label1, label2)
else:
try:
num = int(label)
label = num2label(num)
print(label)
except:
num = label2num(label)
print(num)
2019/12/30 10:07