将数字转换为字母

24

我想把一个数字转换为对应的字母。例如:

1 = A
2 = B
3 = C

在JavaScript中是否可以不手动创建数组来完成这个操作?PHP中有一个range()函数可以自动创建数组,JavaScript中有类似的吗?


你能分享一些示例输入和输出吗? - gurvinder372
提示:检查字母的相应ASCII值。 - LorDex
我这里有一个答案:stackoverflow链接 - Rohit Rahman
8个回答

44
是的,使用Number#toString(36)和一些调整即可。

var value = 10;

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


如果数字大于26怎么办? - Fr0zenFyr
2
如果你只是使用@Fr0zenFyr,那么你会得到错误的结果。在此之前,你需要进行检查,并制定一个规则来处理这种情况。 - Nina Scholz
1
@Fr0zenFyr 最简单的方法是使用模运算符:var value = 36%26; // 结果也是 J - CodeBrauer
@CodeBrauer 我不明白你的意思。这与示例代码有什么关系?是的,36%26等于10,但用这种方式编码所寻找的字母的数值并不直观。如果你像这样做 36%256,仍然会得到大于26的结果。 - Robert M.

28

你可以使用String.fromCharCode(code)函数来做到这一点,而不需要使用数组,因为字母有连续的代码。例如: String.fromCharCode(1+64)会给你'A',String.fromCharCode(2+64)会给你'B',以此类推。


6
我使用它的方式是这样的:String.fromCharCode(1 + 'A'.charCodeAt(0)) - Hafez Divandari

10
以下代码片段将字母表中的字符转换为类似于数字系统的工作方式

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 = ""
    }
}

我创建了这个函数来打印输出时节省字符,但不得不放弃它,因为我不想处理可能会形成的不当词汇。

1
如果您能添加一些关于代码的解释,那就太好了。 - U13-Forward
为了使其正常工作,应删除result = ""。否则,非常好! - aliz_bazar
这个情况并不真正需要递归,使用while循环更好。 - Tofandel

7

只需从0(A)增加letterIndex到25(Z)即可。

const letterIndex = 0
const letter = String.fromCharCode(letterIndex + 'A'.charCodeAt(0))

console.log(letter)

聪明,我喜欢它。 - eballeste

4
更新(5/2/22): 在我需要在第二个项目中使用这段代码后,我决定将下面的答案进行改进,并将其转化为可用的 NPM 库,称为 alphanumeric-encoder。如果您不想自己构建解决此问题的方案,请查看该库!

我构建了以下解决方案作为对 @esantos 答案的改进。

第一个函数定义了有效的查找编码字典。在这里,我使用了英语字母表的所有 26 个字母,但以下任意一个都能正常工作:"ABCDEFG", "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", "GFEDCBA"。使用其中的一个字典将导致将您的十进制数字转换为具有恰当编码数字的基数为dictionary.length 的数字。唯一的限制是字典中的每个字符必须是唯一的。

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
    }
}

我们现在可以使用这个字典来编码我们的十进制数。
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)
        }
    }
}

编码的字母集合很好,但如果我不能将它转换回十进制数字,对计算机来说就没有什么用了。

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
}

现在来测试一下:

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

更新

您还可以使用此函数将缩写格式转换为索引格式。

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}
}

非常好的答案!因为它可以与PHP脚本一起使用来解码和编码。因此,它可以进行跨语言验证。使用此代码:https://dev59.com/5msz5IYBdhLWcg3wxq4V#37142873 只需修复PHP代码中的+1和-1,即可在PHP结果和函数输入上运行。它完美匹配。 - user3768564
通过字母数字唯一键的顺序缩短数字:请尝试使用:https://cutt.ly/URaPxH7。可以对PHP代码进行改进。 - user3768564
我需要它来完成另一个项目,所以我决定将其制作成一个库。请查看:https://www.npmjs.com/package/alphanumeric-encoder - SandPiper

1

有一个单行函数numAbbr,用于将数字转换为字符串,例如

1 => A
2 => B
...
26 => Z
27 => AA
28 => AB
...
702 => ZZ
703 => AAA

const numAbbr = num => num <= 0 ? '' : numAbbr(Math.floor((num - 1) / 26)) + String.fromCharCode((num - 1) % 26 + 65);

而相反的函数abbrNum将类似于AAA的字符串转换为数字


const abbrNum = abbr => abbr.toUpperCase().split("").reduce((acc, val) => acc * 26 + val.charCodeAt(0) - 64, 0);

请参阅我的答案,其中包含与numAbbr相同功能但无递归的代码。 - Tofandel

0
这个问题的代码答案真的过于复杂了,其实只需要一个简单的循环就可以实现。

function colToLetter(number){
  let result = '';
  // number = number - 1; // If starting from 1
  do {
    const letter = String.fromCharCode(65 + (number % 26));
    result = letter + result;
    number = Math.floor(number / 26) - 1;
  } while (number >= 0)
  return result;
}

console.log(colToLetter(0));
console.log(colToLetter(25));
console.log(colToLetter(26));
console.log(colToLetter(702));
console.log(colToLetter(728));

这提供了类似Excel的编号功能。

Excel编号从1开始,而不是从0开始。 - Andrey Izman
不,它从A开始,然后是B...Z,AA,AB等等。巧合的是,在大多数编程语言中,索引从0开始,就像js一样,所以它对应的第一个索引是A。无论如何,根据您想要从哪里开始索引,都有相应的注释。 - Tofandel

-1

这可以帮助你

static readonly string[] Columns_Lettre = new[] { "A", "B", "C"};

public static string IndexToColumn(int index)
    {
        if (index <= 0)
            throw new IndexOutOfRangeException("index must be a positive number");

        if (index < 4)
            return Columns_Lettre[index - 1];
        else
            return index.ToString();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接