I'm looking for a nice way to have a variable alpha
that would increment as follow: when x=0 -> alpha = "A"
; x=1 -> alpha = "B"
; ... x=25 -> alpha = "Z"
; x=26 -> alpha = "AA"
; x=27 -> alpha = "AB"
I'm looking for a nice way to have a variable alpha
that would increment as follow: when x=0 -> alpha = "A"
; x=1 -> alpha = "B"
; ... x=25 -> alpha = "Z"
; x=26 -> alpha = "AA"
; x=27 -> alpha = "AB"
4 Answers
Reset to default 6You could use toString
with base 36
for converting to the wanted letters.
function convert(n) {
var result = '';
do {
result = (n % 26 + 10).toString(36) + result;
n = Math.floor(n / 26) - 1;
} while (n >= 0)
return result.toUpperCase();
}
// A B Z AA AB CZ DXH
console.log([0, 1, 25, 26, 27, 103, 3335].map(convert));
.as-console-wrapper { max-height: 100% !important; top: 0; }
EDITED
OK sorry I just didn't understand your need at first. Here is a working code.
Try this:
var x = 807;
var alpha = '';
var alphabetLength = 26;
var y = x.toString(alphabetLength);
chars = y.split('');
for (var i=0; i < chars.length; i++ ) {
var charFactor = 65;
var curChar = chars[i];
if (isNaN(curChar)) {
alpha += String.fromCharCode(curChar.toUpperCase().charCodeAt() + 10);
} else {
if ( i < chars.length-1) {
charFactor--;
}
alpha += String.fromCharCode(parseInt(curChar) + charFactor);
}
}
console.log(alpha)
Use String.fromCharCode
method and generate string using char code.
// initialize as empty string
var alpha = '';
// iterate upto value is reaching -1 since index starts from 0
while (x > -1) {
// get charactor by finding remainder
// and concatenate it with alpha
alpha = String.fromCharCode(65 + x % 26) + alpha;
// update value of variable x
// decrement by 1 since index starts from 0
x = Math.floor(x / 26) - 1;
}
[1, 28, 25, 26, 27, 3335, 12, 10, 3, 6, 0].forEach(function(x) {
var alpha = '';
while (x > -1) {
alpha = String.fromCharCode(65 + x % 26) + alpha;
x = Math.floor(x / 26) - 1;
}
console.log(alpha);
});
I ended up with a one liner for this:
(alpha).toString(26).split('').map((b26) => (parseInt(b26,26) + 10).toString(36)).join('').toUpperCase()
The basic idea is to convert your number into base 26, which means 0-9a-p, and then add 10 so that the output range is a-z.
Here's a quick test showing that it works for the first 100 numbers.
for (let i = 0; i < 100; i++) {
console.log(i, (i).toString(26).split('').map((b26) => (parseInt(b26,26) + 10).toString(36)).join('').toUpperCase())
}