Convert number to alphabet letter

21,077

Solution 1

Yes, with Number#toString(36) and an adjustment.

var value = 10;

document.write((value + 9).toString(36).toUpperCase());

Solution 2

You can simply do this without arrays using String.fromCharCode(code) function as letters have consecutive codes. For example: String.fromCharCode(1+64) gives you 'A', String.fromCharCode(2+64) gives you 'B', and so on.

Solution 3

Snippet below turns the characters in the alphabet to work like numerical system

1 = A
2 = B
...
26 = Z
27 = AA
28 = AB
...
78 = BZ
79 = CA
80 = CB

var alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
var result = ""
function printToLetter(number){
    var charIndex = number % alphabet.length
    var quotient = number/alphabet.length
    if(charIndex-1 == -1){
        charIndex = alphabet.length
        quotient--;
    }
    result =  alphabet.charAt(charIndex-1) + result;
    if(quotient>=1){
        printToLetter(parseInt(quotient));
    }else{
        console.log(result)
        result = ""
    }
}

I created this function to save characters when printing but had to scrap it since I don't want to handle improper words that may eventually form

Solution 4

I built the following solution as an enhancement to @esantos's answer.

The first function defines a valid lookup encoding dictionary. Here, I used all 26 letters of the English alphabet, but the following will work just as well: "ABCDEFG", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", "GFEDCBA". Using one of these dictionaries will result in converting your base 10 number into a base dictionary.length number with appropriately encoded digits. The only restriction is that each of the characters in the dictionary must be unique.

function getDictionary() {
    return validateDictionary("ABCDEFGHIJKLMNOPQRSTUVWXYZ")

    function validateDictionary(dictionary) {
        for (let i = 0; i < dictionary.length; i++) {
            if(dictionary.indexOf(dictionary[i]) !== dictionary.lastIndexOf(dictionary[i])) {
                console.log('Error: The dictionary in use has at least one repeating symbol:', dictionary[i])
                return undefined
            }
        }
        return dictionary
    }
}

We can now use this dictionary to encode our base 10 number.

function numberToEncodedLetter(number) {
    //Takes any number and converts it into a base (dictionary length) letter combo. 0 corresponds to an empty string.
    //It converts any numerical entry into a positive integer.
    if (isNaN(number)) {return undefined}
    number = Math.abs(Math.floor(number))

    const dictionary = getDictionary()
    let index = number % dictionary.length
    let quotient = number / dictionary.length
    let result
    
    if (number <= dictionary.length) {return numToLetter(number)}  //Number is within single digit bounds of our encoding letter alphabet

    if (quotient >= 1) {
        //This number was bigger than our dictionary, recursively perform this function until we're done
        if (index === 0) {quotient--}   //Accounts for the edge case of the last letter in the dictionary string
        result = numberToEncodedLetter(quotient)
    }

    if (index === 0) {index = dictionary.length}   //Accounts for the edge case of the final letter; avoids getting an empty string
    
    return result + numToLetter(index)

    function numToLetter(number) {
        //Takes a letter between 0 and max letter length and returns the corresponding letter
        if (number > dictionary.length || number < 0) {return undefined}
        if (number === 0) {
            return ''
        } else {
            return dictionary.slice(number - 1, number)
        }
    }
}

An encoded set of letters is great, but it's kind of useless to computers if I can't convert it back to a base 10 number.

function encodedLetterToNumber(encoded) {
    //Takes any number encoded with the provided encode dictionary 

    const dictionary = getDictionary()
    let result = 0
    let index = 0

    for (let i = 1; i <= encoded.length; i++) {
        index = dictionary.search(encoded.slice(i - 1, i)) + 1
        if (index === 0) {return undefined} //Attempted to find a letter that wasn't encoded in the dictionary
        result = result + index * Math.pow(dictionary.length, (encoded.length - i))
    }

    return result
}

Now to test it out:

console.log(numberToEncodedLetter(4))     //D
console.log(numberToEncodedLetter(52))    //AZ
console.log(encodedLetterToNumber("BZ"))  //78
console.log(encodedLetterToNumber("AAC")) //705

UPDATE

You can also use this function to take that short name format you have and return it to an index-based format.

function shortNameToIndex(shortName) {
    //Takes the short name (e.g. F6, AA47) and converts to base indecies ({6, 6}, {27, 47})

    if (shortName.length < 2) {return undefined}    //Must be at least one letter and one number
    if (!isNaN(shortName.slice(0, 1))) {return undefined}  //If first character isn't a letter, it's incorrectly formatted

    let letterPart = ''
    let numberPart= ''
    let splitComplete = false
    let index = 1

    do {
        const character = shortName.slice(index - 1, index)
        if (!isNaN(character)) {splitComplete = true}
        if (splitComplete && isNaN(character)) {
            //More letters existed after the numbers. Invalid formatting.
            return undefined    
        } else if (splitComplete && !isNaN(character)) {
            //Number part
            numberPart = numberPart.concat(character)
        } else {
            //Letter part
            letterPart = letterPart.concat(character)
        }
        index++
    } while (index <= shortName.length)

    numberPart = parseInt(numberPart)
    letterPart = encodedLetterToNumber(letterPart)

    return {xIndex: numberPart, yIndex: letterPart}
}
Share:
21,077
xpedobearx
Author by

xpedobearx

Updated on December 23, 2021

Comments

  • xpedobearx
    xpedobearx over 2 years

    I want to convert a number to its corresponding alphabet letter. For example:

    1 = A
    2 = B
    3 = C
    

    Can this be done in javascript without manually creating the array? In php there is a range() function that creates the array automatically. Anything similar in javascript?

  • Fr0zenFyr
    Fr0zenFyr about 5 years
    What if the number > 26?
  • Nina Scholz
    Nina Scholz about 5 years
    @Fr0zenFyr, then you get a wrong result. you need a check before and a rule what should happen in this case.
  • U12-Forward
    U12-Forward over 4 years
    Would be nice if you'd add some explanation about the code
  • Hafez Divandari
    Hafez Divandari almost 4 years
    I use it like this: String.fromCharCode(1 + 'A'.charCodeAt(0))
  • CodeBrauer
    CodeBrauer over 3 years
    @Fr0zenFyr easiest way is to use modulo: var value = 36 % 26; // results also o J
  • user3768564
    user3768564 over 2 years
    Great answer! Because it can be used with PHP script to decode and encode. So it can be cross language validated. Using this code: stackoverflow.com/questions/7664121/… Just had to fix PHP code to from +1 and -1, on PHP results and function input. And it works perfectly matches.
  • user3768564
    user3768564 over 2 years
    Shorten number by unique key order of alphanumeric: Try out: cutt.ly/URaPxH7 Improvements can be on to PHP code.
  • SandPiper
    SandPiper about 2 years
    I needed this for a second project, so I decided to just make it into a library. Check it out: npmjs.com/package/alphanumeric-encoder
  • eballeste
    eballeste about 2 years
    smart, I like it