tipos - string to number javascript
Convertir entero en su equivalente de caracteres en Javascript (11)
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 );
}
entrada: 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 incluso más rápido que el primer método (básicamente es solo una búsqueda).
Quiero convertir un entero en su equivalente de personaje basado en el alfabeto. Por ejemplo:
0 => a
1 => b
2 => c
3 => d
¿Podría construir una matriz y buscarla solo cuando la necesito pero me pregunto si hay una función incorporada 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 una posición de caracteres en el alfabeto.
Aclamaciones. :)
El único problema con la gran solución de @ mikemaccana es que utiliza el operador binario >>, que es costoso en términos de rendimiento. Sugiero esta modificación a su gran trabajo como una ligera mejora que quizás sus colegas 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 un trazador de líneas
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"
El String.fromCharCode de Javascript (código1, código2, ..., códigoN) toma un número infinito de argumentos y devuelve una cadena de letras cuyos valores ASCII correspondientes son code1, code2, ... codeN. 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
}
Genera números aleatorios y caracteres para la verificación del teléfono o algo más.
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);
Aquí hay un link
Será más portátil en caso de extenderse a otros alfabetos:
char=''abcdefghijklmnopqrstuvwxyz''[code]
o, para ser más compatible (con nuestra querida IE):
char=''abcdefghijklmnopqrstuvwxyz''.charAt(code);
Si no te importa recuperar cadenas multi-character, puedes soportar í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 se ha probado exhaustivamente para detectar errores de precisión :)
Suponiendo que quieres letras minúsculas:
var chr = String.fromCharCode(97 + n); // where n is 0, 1, 2 ...
97 es el código ASCII para minúscula ''a''. Si desea letras mayúsculas, reemplace 97 con 65 (mayúscula ''A''). Tenga en cuenta que si n > 25
, saldrá del rango de letras.
Suponiendo que quieres mayúsculas y minú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"
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 convertir el número a la base 36, por lo que tiene los siguientes caracteres:
0123456789abcdefghijklmnopqrstuvwxyz
^ ^
n n+10
Al compensar por 10, los caracteres comienzan en a
lugar de 0
.
Sin embargo, no estoy seguro de cuán rápido compararía los dos ejemplos diferentes del lado del cliente.
Use String.fromCharCode
. Esto devuelve una cadena de un valor Unicode, que coincide con los primeros 128 caracteres de ASCII.
var a = String.fromCharCode(97);
public static string IntToLetters(int value)
{
string result = string.Empty;
while (--value >= 0)
{
result = (char)(''A'' + value % 26 ) + result;
value /= 26;
}
return result;
}
Para cumplir con el requisito de que A sea 1 en lugar de 0, agregué - a la condición de ciclo while, y eliminé el valor-- del final del ciclo, si alguien quiere que sea 0 para sus propios fines, usted puede revertir los cambios, o simplemente agregar valor ++; al comienzo de todo el método.