Progresos por fin, despues de haberlo intentado horas.
El problema es que la escala en la que nosotros representamos el abecedario es
Código PHP:
var YOdevuelvo="abcdefghijklmnopqrstuvwxyz"
pero la escala en la que javascript devuelve esa misma cadena al hacer el toString() es
Código PHP:
var ELdevuelve="0123456789abcdefghijklmnop";
, luego ahi tenemos un grave problema.
Lo que hago es codificar el numero en la base de la longitud de ELdevuelve
Código PHP:
var resultado=(num).toString(ELdevuelve.length);
. 'resultado' seguro contiene letras unicamente de la cadena ELdevuelve, ya que es su escala de caracteres cuando la base es ELdevuelve.length.
Espero que me podais seguir hasta aqui.
Ahora lo que hago es transformar esos caracteres (suyos) a los mios. Es decir, al '0' le corresponde la 'a', al '1' la 'b', al '2' la 'c'... y asi hasta la 'p', que le corresponde la 'z'.
Construyo el script, y me encuentro mi primer problema: El "numero" que va despues de 'p' (='z') no es '00' (='aa'), si no '10' (='ba'). Asi que pienso que si se encuentra un numero que esta en las decimas, se le debe restar 1. Lo hago asi y funciona a la perfeccion, hasta que llegamos a '100' (='aaa'). Claro, qué pasa. Que a la cifra de las centenas (1) le quito 1, y todo bien. A la cifra de las decenas (0) le quito 1, y da -1. ERROR.
Se me ha ocurrido solucionar el problema diciendo que la resta de 1 solo la ejecute una vez por transformacion. Es decir, que si le quita a las centenas, a las decenas ya no. Si se lo quita a los miles, a las centenas ya no.
Y funciona!. de 'zz' pasa a 'aaa', y de 'zzz' pasa de 'aaaa'. Comprobado.
Código PHP:
var YOdevuelvo="abcdefghijklmnopqrstuvwxyz".split("");
var ELdevuelve="0123456789abcdefghijklmnop";
function num2letra(num) {
var resultado=(num).toString(ELdevuelve.length);
resultado=resultado.split("");
var final="";
var quitado=false;
for(var a=0;a<resultado.length;a++) {
n=resultado[a];
//si no se le ha quitado, si a>decenas, y si es un numero del 1 al 9 (el cero no vale)
if( resultado.length-1>a && resultado[a].search(/^[1-9]$/)==0 && quitado==false ) {
//document.write("Le quito '"+(1)+"' al '"+resultado[a]+"'...."); //debug
n-=1; //le restamos 1
quitado=true;
}
pos= ELdevuelve.indexOf(n);
final+= YOdevuelvo[pos];
}
return ["Convertido="+resultado.join(""),"Final="+final];
}
Se puede imprimir un bucle, por ejemplo:
Código PHP:
for(a=0;a<1000;a++) {
document.write('Numero'+a+' --> '+num2letra(a).join("; ")+'<br/>');
}
Ahora bien, no todo es camino de rosas, porque ya le he encontrado un fallo. Resulta que a las decenas le quitamos 1 si es por ejemplo un 9. El "numero" '9p' antes de sustituirlo lo convertimos a '8p'. Lo sustituimos y da 'iz'. El numero siguiente es 'a0', que lo convertimos a 'a0' (no se toca) y da 'ka', en vez de 'ja'.
¿Y porque se salta la J? Pues porque el '9' es convertido a '8', que segun
Código PHP:
var YOdevuelvo="abcdefghijklmnopqrstuvwxyz"
var ELdevuelve="0123456789abcdefghijklmnop";
se corresponde a 'i'. Pero despues de ese '8' nuestro, se pasa a 'a', en vez de a '9'; y 'a' no se toca. Es decir: en el ciclo nuestro de una vez convertido (antes de sustituir), nos pasamos el '9'.
De momento no se como solucionarlo, supongo que a parte de los numeros de las decenas, centenas y miles, tambien hay que quitarle 1 a las letras de esas posiciones....
Aunque de momento va bien, no?