Преобразуйте целое число в его символьный эквивалент, где 0 => a, 1 => b и т.д.
Я хочу преобразовать целое число в его символьный эквивалент на основе алфавита. Например:
0 => a
1 => b
2 => c
3 => d
и т.д. Я мог бы создать массив и просто посмотреть его, когда мне это нужно, но мне интересно, есть ли встроенная функция, чтобы сделать это для меня. Все примеры, которые я нашел через Google, работают со значениями ASCII, а не с позицией символов в алфавите.
Ответы
Ответ 1
Предполагая, что вам нужны строчные буквы:
var chr = String.fromCharCode(97 + n); // where n is 0, 1, 2 ...
97 - это код ASCII для нижнего регистра "a". Если вам нужны прописные буквы, замените 97 на 65 (в верхнем регистре "A" ). Обратите внимание, что если n > 25
, вы выйдете из диапазона букв.
Ответ 2
Будет более переносимым в случае распространения на другие алфавиты:
char='abcdefghijklmnopqrstuvwxyz'[code]
или, чтобы быть более совместимым (с нашим любимым IE):
char='abcdefghijklmnopqrstuvwxyz'.charAt(code);
Ответ 3
Если вы не возражаете возвращать многосимвольные строки, вы можете поддерживать произвольные положительные индексы:
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
(Не проверен на точность ошибок:)
Ответ 4
Простым ответом будет (26 символов):
String.fromCharCode(97+n);
Если пространство драгоценно, вы можете сделать следующее (20 символов):
(10+n).toString(36);
Подумайте, что вы могли бы сделать со всеми этими лишними байтами!
Как это работает, вы конвертируете число в базу 36, поэтому у вас есть следующие символы:
0123456789abcdefghijklmnopqrstuvwxyz
^ ^
n n+10
За счет смещения на 10 символы начинаются с a
вместо 0
.
Не совсем уверен, насколько быстро будут выполняться два разных примера клиентской стороны.
Ответ 5
Javascript String.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
}
Ответ 6
Используйте String.fromCharCode
. Это возвращает строку из значения Unicode, которое соответствует первым 128 символам ASCII.
var a = String.fromCharCode(97);
Ответ 7
Мне не нравятся все решения, использующие магические числа, такие как 97
или 36
.
const A = 'A'.charCodeAt(0);
let numberToCharacter = number => String.fromCharCode(A + number);
let characterToNumber = character => character.charCodeAt(0) - A;
это предполагает заглавные буквы и начинается с 'A' в 0.
Ответ 8
Там вы идете: (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];
};
})();
возвращает undefined в случае ошибки диапазона.
ПРИМЕЧАНИЕ: массив будет создан только один раз, и из-за закрытия он будет доступен для новой функции codeToChar. Я предполагаю, что это даже быстрее, чем первый метод (это просто поиск в основном).
Ответ 9
Единственная проблема с отличным решением @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"
Ответ 10
Попробуйте
(n+10).toString(36)
chr = n=>(n+10).toString(36);
for(i=0; i<26; i++) console.log('${i} => ${ chr(i) }');
Ответ 11
Предполагая, что вам нужны буквы в верхнем регистре:
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"
![номер в букву]()
Ответ 12
Он генерирует случайное число и char для проверки телефона или что-то еще.
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);
Вот ссылка
Ответ 13
public static string IntToLetters(int value)
{
string result = string.Empty;
while (--value >= 0)
{
result = (char)('A' + value % 26 ) + result;
value /= 26;
}
return result;
}
Чтобы соответствовать требованию A, являющемуся 1 вместо 0, я добавил - к условию цикла while и удалил значение - с конца цикла, если кто-то хочет, чтобы это было 0 для собственных целей, вы можете отменить изменения или просто добавить значение ++; в начале всего метода.