Преобразуйте целое число в его символьный эквивалент, где 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'). Обратите внимание, что если
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 заключается в том, что он использует двоичный оператор>>, который является дорогостоящим, с точки зрения производительности. Я предлагаю эту модификацию его великой работы как небольшое улучшение, которое ваши коллеги, возможно, могут прочитать более легко.
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') и ["A", "C", "D"]
numberToLetter('5') и "F"
Он генерирует случайное число и Чара для проверки телефона или что-то еще.
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 для своих собственных целей, вы можете отменить изменения или просто добавить значение++; в начале всего метода.