Excelのカラムの表記(26進数)と10進数をjsで相互変換するレアな要求があったのでその対応。
手動実装はしんどいなと思っていたところ、ライブラリがあるみたいなので試す。
とりあえずテストも書かれているbase26というのを触ってみる。他にもあるみたい。
インストール
npm install --save base26
実装
とりあえずindex.jsってファイルを作って記述。
index.js
//10進数を26進数に変換して大文字表示
console.log(base26.to(10));
console.log(base26.to(100));
//26進数を10進数に変換
console.log(base26.from('j'));
console.log(base26.from('cv'));
実行と確認
まあ、動きます。
node index.js
j
cv
10
100
大文字にしたければtoUpperCase()などを使えば良い。
自力でto, fromを行う
いちおう自力で計算する方法も。
ASCIIコードを利用する。
//toBase26
//0とかだとおかしくなる
function to(num) {
const mod = num % 26;
let pow = num / 26 | 0;
const out = mod ? String.fromCharCode(64 + mod) : (--pow, 'Z');
return pow ? to(pow) + out : out;
}
//toBase1
//手抜きなので大文字じゃないとだめ
function from(str){
let out = 0;
const len = str.length;
let pos = len;
while(--pos > -1){
out += (str.charCodeAt(pos) - 64) * Math.pow(26, len - 1 - pos);
}
return out;
}
//利用
console.log(to(1));
console.log(from('A'));