2012-06-18 17 views
9

Esto es probablemente una solicitud inusual, pero para mi secuencia de comandos necesito una función que se incrementa por letra en lugar de número. Por ejemplo:Cuente con A, B, C, D en lugar de 0, 1, 2, 3, ... con JavaScript

Este es un ejemplo numérico:

var i = 0; 
while(condition){ 
window.write('We are at '+i); 
++i; 
} 

Esencialmente, quiero contar con letras, como lo hace Microsoft Excel, en lugar de números. Entonces, en lugar de imprimir "Estamos en 0", "Estamos en 1", "Estamos en 2", etc., necesito imprimir "Estamos en A", "Estamos en B", "Estamos en C ", etc.

Para imitar Excel (el único ejemplo que se me ocurre), después de alcanzar el índice 25 (Z), podríamos pasar a 'AA', 'AB', 'AC', etc.

por lo tanto, sería un gran trabajo, así:

var i = 0; 
while(condition){ 
window.write('We are at '+toLetter(i)); 
++i; 
} 

Aún mejor si alguien puede escribir una función que convierte entonces una carta de nuevo en un dígito, es decir ToNumber ('a') = 0 o ToNumber ('CC ') = 107 (creo).

Gracias!

+2

Lo siento por preguntando, pero ¿qué intentaste? Hasta ahora, parece una tarea para mí. – alf

+0

Por lo tanto, debe escribir enNumber() y enLetter(). Esto parece una búsqueda algorítmica muy simple. Muéstranos lo que has intentado. –

+0

Puede construir una matriz de letras y luego comparar su conteo con la clave de la matriz (asegurándose de compensar la posición "0"). Si tu recuento comienza en cero, entonces eres bueno. – gtr1971

Respuesta

0

Cree una matriz de letras A, B, C, D, etc. luego llame a A usando array [0] ya que 0 es el índice de A puede usar array [i] como índice, solo valide para que yo no puede ser mayor de 25 años

uso cualquiera de estas formas de crear la matriz:

var alphabet = new Array("A","B","C"); 

var alphabet = new Array(25); 
alphabet[0] = "A"; 
alphabet[1] = "B"; 
alphabet[2] = "C"; 

en lugar de toLetter(i); uso alphabet[i];

+0

No creo que lo haría de esta manera, pero si lo hiciera, simplemente haría una cadena con todos los caracteres del alfabeto. JavaScript le permite acceder a los caracteres de una cadena con notación de matriz. Además: no es necesario preasignar el espacio en una matriz a través del constructor Array; en realidad no hará nada en ningún tiempo de ejecución moderno. – Pointy

+0

Tienes razón, estoy un poco oxidado de JavaScript. – erran

2

Algo como esto quiere decir?

function num2chars(num, upper){ 
num2chars.letters = num2chars.letters || 'abcdefghijklmnopqrstuvwxyz'.split(''); 
var ret = repeat(num2chars.letters[num%26],Math.floor(num/26)); 

function repeat(chr,n){ 
    if (n<1) {return chr;} 
    return new Array(n+1).join(chr); 
} 

return upper ? ret.toUpperCase() : ret; 
} 
//usage 
while(i<104){ 
console.log(num2chars((i+=1),true)); 
} 
//=> A..Z, AA..ZZ, AAA..ZZZ 
+0

JavaScript le permite indexar en cadenas como si fueran matrices, por lo que no es necesario '.split()' realmente. – Pointy

+0

tienes razón. El código fue un fragmento rápido y sucio. – KooiInc

+0

@Pointy: Moví mi comentario aquí ya que es más relevante. El '.split()' es necesario por el bien de IE * (8 y más abajo, creo) *. De lo contrario, necesitarías '.charAt()'. –

0

Intente lo siguiente. Probado en pocos minutos

var prefix = Array('','A','B'); //this will extends to 3x26 letters. Determines the Max generated 
//first element of prefix is `''` so you can have A B C D 
var prefix = Array('','A','B'); 
var alphabets = Array('A','B','C','D'); //extend this to Z 
var letters = Array(); 

function fillArray() 
{ 
    var prefix_len = prefix.length; 
    var array_len = prefix_len * alphabets.length; 
    var alpha_len = alphabets.length; 

    for(var i=0; i<prefix_len; i++) 
    { 
     for(var a=0; a<alpha_len; a++) 
     letters.push(''+prefix[i]+alphabets[a]); 
    } 



} 

function getLetter(index) 
{ 
    return letters[index]; 
} 


function generateTestValues() 
{ 
    fillArray(); 
    //make sure 10 is less than letters.length 
    for(var i=0; i<10; i++) 
    document.write(getLetter(i)+' '); //A B C D AA AB AC AD BA BB BC.... 
} 

HTML

<span id="clickable" onclick="generateTestValues()">Click Me</span> 
22

He aquí una función recursiva sencilla para convertir los números a las letras.

Tiene una base, por lo que 1 es A, 26 es Z, 27 es AA.

function toLetters(num) { 
    "use strict"; 
    var mod = num % 26, 
     pow = num/26 | 0, 
     out = mod ? String.fromCharCode(64 + mod) : (--pow, 'Z'); 
    return pow ? toLetters(pow) + out : out; 
} 

Aquí hay una función de adaptación para convertir las cuerdas de nuevo a los números:

function fromLetters(str) { 
    "use strict"; 
    var out = 0, len = str.length, pos = len; 
    while (--pos > -1) { 
     out += (str.charCodeAt(pos) - 64) * Math.pow(26, len - 1 - pos); 
    } 
    return out; 
} 

una prueba: http://jsfiddle.net/St6c9/

+0

Casi. La tercera línea debe ser 'var out = String.fromCharCode (65 + (num% 26));' De lo contrario, se basará en cero. –

+0

@Jules estaba bastante roto ... dime lo que piensas de él ahora :) –

+0

dulce. buen violín –

0

Eso es cómo se puede generar letras al azar:

function getRandomArbitrary(min, max) { 
    max = Math.ceil(max); 
    min = Math.floor(min); 
    return Math.round(Math.random() * (max - min) + min); 
} 

function assignLetter(){ 
    var group = ['A', 'B', 'C', 'D']; 
    var text = 'We are at '; 
    var str = ''; 
    str = text + group[getRandomArbitrary(0, group.length-1)]; 
    return str; 
} 
assignLetter(); 
+1

OP no quiere letras al azar, quiere secuenciales como en excel – MotKohn

Cuestiones relacionadas