Перетворіть ціле число в його еквівалент символів, де 0 => a, 1 => b тощо


173

Я хочу перетворити ціле число в його еквівалент символів на основі алфавіту. Наприклад:

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

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


2
Малі літери впорядковані в алфавітному порядку в ASCII.
Анон.

13
Навіть цифри ;-)
mbq

Відповіді:


324

Припустимо, що вам потрібні маленькі літери:

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

97 - код ASCII для малого регістру 'a'. Якщо вам потрібні великі літери, замініть 97 на 65 (великі регістри "A"). Зауважте, що якщо n > 25ви вийдете з діапазону букв.


82

Буде більш портативним у випадку поширення на інші алфавіти:

char='abcdefghijklmnopqrstuvwxyz'[code]

або, щоб бути більш сумісним (з нашим улюбленим IE):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);

5
Набагато елегантніше, ніж String.fromCharCodeна мою думку, як ви сказали, це поширюється дуже легко.
Саша Чедигов

8
І коли у вас немає необхідності у продовженні, можливо, більш схильні до помилок? abcede
Нельсон

5
FYI JScript (IE) не підтримує оператор індексу []на рядках.
Півмісяць Свіжий

4
@Crescent, доступ до []властивостей у рядках підтримується в IE від IE8 вгору (IE8 у режимі IE7 compat також не працює), 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

(Не ретельно перевірено на помилки точності :)


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
}

4
Що ж, щоб бути педантичним, воно потребує змінної кількості аргументів, а не нескінченне число.
wchargin

4

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

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

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

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

це передбачає великі літери і починається з "A" на 0.


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, або він поверне помилковий (помилка діапазону);

АБО:

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

повертається невизначено у випадку помилки діапазону. ПРИМІТКА: масив буде створений лише один раз, і через закриття він буде доступний для нової функції codeToChar. Я думаю, це навіть швидше, ніж перший метод (це в основному просто пошук).


Це працює з 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"


-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"

функція від цифри до літери

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.