我想把一个数字转换为对应的字母。例如:
1 = A
2 = B
3 = C
在JavaScript中是否可以不手动创建数组来完成这个操作?PHP中有一个range()函数可以自动创建数组,JavaScript中有类似的吗?
我想把一个数字转换为对应的字母。例如:
1 = A
2 = B
3 = C
在JavaScript中是否可以不手动创建数组来完成这个操作?PHP中有一个range()函数可以自动创建数组,JavaScript中有类似的吗?
Number#toString(36)
和一些调整即可。
var value = 10;
document.write((value + 9).toString(36).toUpperCase());
var value = 36%26;
// 结果也是 J
。 - CodeBrauer你可以使用String.fromCharCode(code)
函数来做到这一点,而不需要使用数组,因为字母有连续的代码。例如: String.fromCharCode(1+64)
会给你'A',String.fromCharCode(2+64)
会给你'B',以此类推。
String.fromCharCode(1 + 'A'.charCodeAt(0))
- Hafez Divandarivar 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 = ""
}
}
result = ""
。否则,非常好! - aliz_bazar只需从0(A)增加letterIndex到25(Z)即可。
const letterIndex = 0
const letter = String.fromCharCode(letterIndex + 'A'.charCodeAt(0))
console.log(letter)
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}
}
有一个单行函数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
相同功能但无递归的代码。 - Tofandelfunction 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));
这可以帮助你
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();
}