Преобразовать целое число в его символьный эквивалент, где 0 => a, 1 => b и т. д

Я хочу преобразовать целое число в его символьный эквивалент на основе алфавита. Например:

0 => a
1 => b
2 => c
3 => d

etc. Я мог бы построить массив и просто искать его, когда мне это нужно, но мне интересно, есть ли встроенная функция, чтобы сделать это для меня. Все примеры, которые я нашел через Google, работают со значениями ASCII, а не с позицией символа в алфавите.

12 ответов


предполагая, что вы хотите строчные буквы:

var chr = String.fromCharCode(97 + n); // where n is 0, 1, 2 ...

97-это код ASCII для нижнего регистра "a". Если вы хотите прописные буквы, замените 97 на 65 (верхний регистр 'A'). Обратите внимание, что if n > 25, вы выйдете из диапазона букв.


будет более портативным в случае расширения на другие алфавиты:

char='abcdefghijklmnopqrstuvwxyz'[code]

или, чтобы быть более совместимым (с нашим любимым IE):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);

Если вы не против получить многосимвольные строки обратно, вы можете поддерживать произвольные положительные индексы:

function idOf(i) {
    return (i >= 26 ? idOf((i / 26 >> 0) - 1) : '') +  'abcdefghijklmnopqrstuvwxyz'[i % 26 >> 0];
}

idOf(0) // a
idOf(1) // b
idOf(25) // z
idOf(26) // aa
idOf(27) // ab
idOf(701) // zz
idOf(702) // aaa
idOf(703) // aab

(не полностью проверено на точность ошибок:)


простой ответ будет (26 символов):

String.fromCharCode(97+n);

если пространство драгоценно, вы можете сделать следующее (20 символов):

(10+n).toString(36);

подумайте о том, что вы могли бы сделать со всеми этими дополнительными байтами!

как это работает, вы преобразуете число в базу 36, поэтому у вас есть следующие символы:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

путем смещения на 10 символов начинаются с a вместо 0.

не совсем уверен в том, как быстро работает однако два разных примера на стороне клиента будут сравниваться.


строка Javascript.fromCharCode (code1, code2,..., codeN) принимает бесконечное количество аргументов и возвращает строку букв, соответствующие значения ASCII которых code1, code2,... codeN. Поскольку 97 является " a " в ASCII, мы можем настроить индексацию, добавив 97 к вашему индексу.

function indexToChar(i) {
  return String.fromCharCode(i+97); //97 in ASCII is 'a', so i=0 returns 'a', 
                                    // i=1 returns 'b', etc
}

использовать String.fromCharCode. Это возвращает строку из значения Unicode, которое соответствует первым 128 символам ASCII.

var a = String.fromCharCode(97);

вот так: (a-zA-Z)

function codeToChar( number ) {
  if ( number >= 0 && number <= 25 ) // a-z
    number = number + 97;
  else if ( number >= 26 && number <= 51 ) // A-Z
    number = number + (65-26);
  else
    return false; // range error
  return String.fromCharCode( number );
}

input: 0-51, или оно возвратит false (ошибку ряда);

или:

var codeToChar = function() {
  var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
  return function( code ) {
    return abc[code];
  };
})();

возвращает undefined в случае ошибки. Примечание: массив будет создан только один раз и из-за закрытия он будет доступен для новой функции codeToChar. Я думаю, что это еще быстрее, чем первый метод (это просто поиск в основном).


единственная проблема с отличным решением @mikemaccana заключается в том, что он использует оператор binary>>, который является дорогостоящим, с точки зрения производительности. Я предлагаю эту модификацию его великой работы как небольшое улучшение, которое ваши коллеги, возможно, смогут прочесть легче.

const getColumnName = (i) => {
     const previousLetters = (i >= 26 ? getColumnName(Math.floor(i / 26) -1 ) : '');
     const lastLetter = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; 
     return previousLetters + lastLetter;
}

или как однострочный

const getColumnName = i => (i >= 26 ? getColumnName(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26];

пример:

getColumnName(0); // "A"
getColumnName(1); // "B"
getColumnName(25); // "Z"
getColumnName(26); // "AA"
getColumnName(27); // "AB"
getColumnName(80085) // "DNLF"

мне не нравятся все решения, которые используют магические числа, такие как 97 или 36.

const A = 'A'.charCodeAt(0);

let numberToCharacter = number => String.fromCharCode(A + number);

let characterToNumber = character => character.charCodeAt(0) - A;

это предполагает прописные буквы и начинается 'A' в 0.


предполагая, что вы хотите прописные буквы:

function numberToLetter(num){
        var alf={
            '0': 'A', '1': 'B', '2': 'C', '3': 'D', '4': 'E', '5': 'F', '6': 'G'
        };
        if(num.length== 1) return alf[num] || ' ';
        return num.split('').map(numberToLetter);
    }

пример:

numberToLetter('023') is ["A", "C", "D"]

numberToLetter('5') is "F"

number to letter function


Он генерирует случайное число и Чара для проверки телефона или что-то еще.

function randomIntFromInterval(min,max)
{
    return Math.floor(Math.random()*(max-min+1)+min);
}




function generateRandomVerification(length){
let char;
let sum ="";
  for(let i=0;i < length;i++){
    if(Math.round(Math.random())){
      random = randomIntFromInterval(65,90);
      char = String.fromCharCode(random);//65-90
      sum = sum + char;
      console.log("CHAR: ", char);
    }else{
      random = randomIntFromInterval(48,57);
      char = String.fromCharCode(random);//48-57
      sum = sum + char;
      console.log("CHAR: ", char);
    }
  }
  alert(sum);
}

generateRandomVerification(5);

здесь ссылке


public static string IntToLetters(int value)
{
string result = string.Empty;
while (--value >= 0)
{
result = (char)('A' + value % 26 ) + result;
value /= 26;
}
return result;
}

чтобы удовлетворить требование существа 1 вместо 0, я добавил -- к условию цикла while и удалил значение-- из конца цикла, если кто-то хочет, чтобы это было 0 для их собственных целей, вы можете отменить изменения или просто добавить значение++; в начале всего метода.