Convierta un entero en su equivalente de caracteres, donde 0 => a, 1 => b, etc.

173

Quiero convertir un entero en su carácter equivalente basado en el alfabeto. Por ejemplo:

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

etc. Podría construir una matriz y simplemente buscarla cuando la necesite, pero me pregunto si hay una función integrada para hacer esto por mí. Todos los ejemplos que he encontrado a través de Google están trabajando con valores ASCII y no con la posición de un personaje en el alfabeto.

VIVA LA NWO
fuente
2
Las letras minúsculas están ordenadas alfabéticamente en ASCII.
Anon
13
Incluso los dígitos ;-)
mbq

Respuestas:

324

Suponiendo que quiere letras minúsculas:

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

97 es el código ASCII para minúsculas 'a'. Si desea letras mayúsculas, reemplace 97 con 65 (mayúsculas 'A'). Tenga en cuenta que si n > 25saldrá del rango de letras.

Daniel Vandersluis
fuente
82

Será más portátil en caso de extenderse a otros alfabetos:

char='abcdefghijklmnopqrstuvwxyz'[code]

o, para ser más compatible (con nuestro querido IE):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);
mbq
fuente
55
Mucho más elegante que String.fromCharCodeen mi opinión, como dijiste, se extiende muy fácilmente.
Sasha Chedygov
8
Y cuando no tiene necesidad de extender, ¿quizás sea más propenso a errores? abcede
Nelson Rothermel
55
FYI JScript (IE) no admite el operador de índice []en cadenas.
Crescent Fresh
44
@Crescent, el descriptor de acceso de []propiedad en cadenas es compatible con IE desde IE8 en adelante (IE8 en modo de compatibilidad con IE7 tampoco funciona), String.prototype.chatAtse prefiere en lugar de la []compatibilidad del navegador. Por ejemplo'foo'.charAt(0) == 'f'
CMS
2
@Crescent, olvidé mencionar que el descriptor de acceso de []propiedad en cadenas está estandarizado en ECMAScript 5 (ver [[GetOwnProperty]] (P) ).
CMS
29

Si no le importa recuperar cadenas de caracteres múltiples, puede admitir índices positivos arbitrarios:

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

(No probado exhaustivamente para errores de precisión :)

z0r
fuente
1
Función recursiva, muy agradable!
John Virgolino
@mikemaccana, ¿por qué esta edición? Creo que hace que sea más difícil de leer. Ahora tengo que desplazarme horizontalmente para leer el código.
z0r
@ z0r Para que las personas que usan el código no tengan que arreglar la nueva línea. No hay razón para dividir líneas arbitrariamente, los editores ajustarán el tamaño de los caracteres de su ventana.
mikemaccana
Esto funciona muy bien, ¿hay alguna variante para hacer lo contrario?
Ethannn
Buena idea, pero no funcionó hasta que se cambió a esto:function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
PatrickvL
19

Una respuesta simple sería (26 caracteres):

String.fromCharCode(97+n);

Si el espacio es precioso, puede hacer lo siguiente (20 caracteres):

(10+n).toString(36);

¡Piensa en lo que podrías hacer con todos esos bytes adicionales!

Cómo funciona esto es que convierte el número a base 36, por lo que tiene los siguientes caracteres:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

Al compensar por 10 los caracteres comienzan en alugar de0 .

Sin embargo, no estoy completamente seguro de qué tan rápido se compararían los dos ejemplos diferentes del lado del cliente.

Dan
fuente
2
Disfruté de tu creatividad base 36
Josh
6

String.fromCharCode (código1, código2, ..., códigoN) de Javascript toma un número infinito de argumentos y devuelve una cadena de letras cuyos valores ASCII correspondientes son código1, código2, ... códigoN. Como 97 es 'a' en ASCII, podemos ajustar su indexación agregando 97 a su índice.

function indexToChar(i) {
  return String.fromCharCode(i+97); //97 in ASCII is 'a', so i=0 returns 'a', 
                                    // i=1 returns 'b', etc
}
cien vatios
fuente
44
Bueno, para ser pedante, se necesita un número variable de argumentos, no un número infinito .
wchargin
4

No me gustan todas las soluciones que usan números mágicos como 97o 36.

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

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

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

esto asume letras mayúsculas y comienza 'A' en 0.

junvar
fuente
3

Uso String.fromCharCode. Esto devuelve una cadena de un valor Unicode, que coincide con los primeros 128 caracteres de ASCII.

var a = String.fromCharCode(97);
James Westgate
fuente
3

Ahí tienes: (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, o devolverá falso (error de rango);

O:

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

devuelve indefinido en caso de error de rango. NOTA: la matriz se creará solo una vez y, debido al cierre, estará disponible para la nueva función codeToChar. Supongo que es aún más rápido que el primer método (es solo una búsqueda básicamente).

gblazex
fuente
Eso funciona con ASCII, necesito trabajar con la posición del personaje en el alfabeto.
VIVA LA NWO
@VIVA - ¿Creo que podrías haber solucionado esto? @Galambalaza - Creo que quieres 65 no 64
James Westgate
Acabo de mostrar lo simple que es. él podría haber resuelto esto. Pero ahí lo tienes. ver la actualización
gblazex
1

El único problema con la gran solución de @ mikemaccana es que utiliza el operador binario >> que es costoso, en cuanto a rendimiento. Sugiero esta modificación a su gran trabajo como una ligera mejora que sus colegas quizás puedan leer más fácilmente.

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

O como una sola línea

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

Ejemplo:

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

Suponiendo que quiere letras mayúsculas:

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);
    }

Ejemplo:

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

numberToLetter ('5') es "F"

función de número a letra

Rafael Corrêa Gomes
fuente