Converti il ​​numero intero nel suo equivalente di carattere, dove 0 => a, 1 => b, ecc


173

Voglio convertire un numero intero nel suo equivalente di carattere basato sull'alfabeto. Per esempio:

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

ecc. Potrei costruire un array e cercarlo quando ne ho bisogno, ma mi chiedo se c'è una funzione integrata per fare questo per me. Tutti gli esempi che ho trovato su Google funzionano con valori ASCII e non con la posizione di un personaggio nell'alfabeto.


2
Le lettere minuscole sono ordinate alfabeticamente in ASCII.
Anon.

13
Anche le cifre ;-)
mbq

Risposte:


324

Supponendo di voler lettere minuscole:

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

97 è il codice ASCII per la "a" minuscola. Se si desidera lettere maiuscole, sostituire 97 con 65 (maiuscole 'A'). Nota che se n > 25uscirai dall'intervallo di lettere.


82

Sarà più portatile in caso di estensione ad altri alfabeti:

char='abcdefghijklmnopqrstuvwxyz'[code]

o, per essere più compatibile (con il nostro amato IE):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);

5
Molto più elegante che String.fromCharCodesecondo me, come hai detto, si estende molto facilmente.
Sasha Chedygov,

8
E quando non hai bisogno di estenderti, forse più incline agli errori? abcede
Nelson Rothermel,

5
FYI JScript (IE) non supporta l'operatore indice []sulle stringhe.
Crescent Fresh,

4
@Crescent, l' []accessorio di proprietà sulle stringhe è supportato su IE da IE8 in su (IE8 anche in modalità compatibile IE7 non funziona), String.prototype.chatAtè preferito al posto della []compatibilità del browser. Ad esempio'foo'.charAt(0) == 'f'
CMS,

2
@Crescent, ho dimenticato di menzionare che l' []accessorio proprietà sulle stringhe è standardizzato su ECMAScript 5 (vedi [[GetOwnProperty]] (P) ).
CMS,

29

Se non ti dispiace recuperare stringhe di più caratteri, puoi supportare indici positivi arbitrari:

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

(Non accuratamente testato per errori di precisione :)


1
Funzione ricorsiva, molto bella!
Giovanni Virgolino,

@mikemaccana, perché questa modifica? Penso che sia più difficile da leggere. Ora devo scorrere in orizzontale per leggere il codice.
z0r,

@ z0r Quindi le persone che usano il codice non dovranno riparare la nuova riga. Non c'è motivo di spezzare le linee in modo arbitrario, i redattori andranno a capo alla dimensione del personaggio della finestra.
mikemaccana,

Funziona alla grande, c'è una variante per fare il contrario?
Ethannn,

Bella idea, ma non ha funzionato fino a quando non è cambiato in questo:function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
PatrickvL

19

Una risposta semplice sarebbe (26 caratteri):

String.fromCharCode(97+n);

Se lo spazio è prezioso è possibile effettuare le seguenti operazioni (20 caratteri):

(10+n).toString(36);

Pensa a cosa potresti fare con tutti quei byte extra!

Come funziona è convertire il numero in base 36, in modo da avere i seguenti caratteri:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

Compensando di 10 i personaggi iniziano da ainvece di 0.

Tuttavia, non sono del tutto sicuro della velocità di esecuzione dei due diversi esempi sul lato client.


2
Mi è piaciuta la tua creatività di base 36
Josh,

6

String.fromCharCode di Javascript (code1, code2, ..., codeN) accetta un numero infinito di argomenti e restituisce una stringa di lettere i cui corrispondenti valori ASCII sono code1, code2, ... codeN. Poiché 97 è "a" in ASCII, possiamo adattare la tua indicizzazione aggiungendo 97 al tuo indice.

function indexToChar(i) {
  return String.fromCharCode(i+97); //97 in ASCII is 'a', so i=0 returns 'a', 
                                    // i=1 returns 'b', etc
}

4
Bene, per essere pedanti, ci vuole un numero variabile di argomenti, non un numero infinito .
mercoledì

4

Non mi piacciono tutte le soluzioni che usano numeri magici come 97o 36.

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

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

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

questo presuppone lettere maiuscole e inizia 'A' a 0.


3

Usa String.fromCharCode. Ciò restituisce una stringa da un valore Unicode, che corrisponde ai primi 128 caratteri di ASCII.

var a = String.fromCharCode(97);

3

Ecco qua: (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, oppure restituirà false (errore intervallo);

O:

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

restituisce undefined in caso di errore di intervallo. NOTA: l'array verrà creato una sola volta e, a causa della chiusura, sarà disponibile per la nuova funzione codeToChar. Immagino sia ancora più veloce del primo metodo (in pratica è solo una ricerca).


Funziona con ASCII, devo lavorare con la posizione del personaggio nell'alfabeto.
VIVA LA NWO,

@VIVA - Penso che avresti potuto risolverlo? @Galambalaza - Penso che tu voglia 65 non 64
James Westgate,

ho appena mostrato quanto sia semplice. avrebbe potuto capirlo. ma eccoti. vedi l'aggiornamento
gblazex,

1

L'unico problema con la grande soluzione di @ mikemaccana è l'uso dell'operatore binario >> che è costoso, dal punto di vista delle prestazioni. Suggerisco questa modifica alla sua grande opera come un leggero miglioramento che i tuoi colleghi potranno forse leggere più facilmente.

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

O come one-liner

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

Esempio:

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


-3

Supponendo di voler lettere maiuscole:

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

Esempio:

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

numberToLetter ('5') è "F"

funzione da numero a lettera

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.