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

173

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

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

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

VIVA LA NWO
источник
2
Строчные буквы расположены в алфавитном порядке в ASCII.
Анон.
13
Даже цифры ;-)
mbq

Ответы:

324

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

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

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

Даниэль Вандерслуис
источник
82

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

char='abcdefghijklmnopqrstuvwxyz'[code]

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

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);
МБк
источник
5
Гораздо более элегантно, чем, String.fromCharCodeна мой взгляд, как вы уже сказали, оно распространяется очень легко.
Саша Чедыгов
8
А когда вам не нужно расширяться, может быть, больше подвержены ошибкам? abcede
Нельсон Ротермел
5
FYI JScript (IE) не поддерживает оператор индекса []для строк.
Crescent Fresh
4
@Crescent, средство доступа к []свойствам в строках поддерживается в IE от IE8 и выше (IE8 в режиме сравнения IE7 также не работает), String.prototype.chatAtпредпочтительнее, чем []для совместимости с браузером. Например'foo'.charAt(0) == 'f'
CMS
2
@Crescent, забыл упомянуть, что средство доступа к []свойствам в строках стандартизировано в ECMAScript 5 (см. [[GetOwnProperty]] (P) ).
CMS
29

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

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

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

z0r
источник
1
Рекурсивная функция, очень приятно!
Джон Вирголино
@mikemaccana, почему это редактировать? Я думаю, что это затрудняет чтение. Теперь я должен прокрутить горизонтально, чтобы прочитать код.
z0r
@ z0r Таким образом, людям, использующим код, не нужно будет исправлять новую строку. Нет причин произвольно разбивать строки, редакторы будут переносить размер символов в своем окне.
mikemaccana
Это прекрасно работает, есть ли вариант сделать наоборот?
Итанн
Хорошая идея, но она не работала, пока не превратилась в это:function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
PatrickvL
19

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

String.fromCharCode(97+n);

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

(10+n).toString(36);

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

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

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

При смещении на 10 символы начинаются с aвместо 0.

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

Дэн
источник
2
Мне понравилась твоя база 36 творчества
Джош
6

String.fromCharCode Javascript (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
}
hundredwatt
источник
4
Ну, чтобы быть педантичным, требуется переменное количество аргументов, а не бесконечное число.
wchargin
4

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

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

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

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

это предполагает заглавные буквы и начинается с «А» в 0.

junvar
источник
3

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

var a = String.fromCharCode(97);
Джеймс Вестгейт
источник
3

Вот и вы: (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 );
}

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

ИЛИ:

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

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

gblazex
источник
Это работает с ASCII, мне нужно работать с положением символа в алфавите.
VIVA LA NWO
@VIVA - Я думаю, ты мог бы решить это? @Galambalaza - Я думаю, вы хотите 65, а не 64
Джеймс Вестгейт
я просто показал, как это просто. он мог бы решить это. но там вы идете. смотрите обновление
gblazex
1

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

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"
Pandem1c
источник
-3

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

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') равно ["A", "C", "D"]

numberToLetter ('5') равно "F"

функция цифра в букву

Рафаэль Корреа Гомес
источник