2012-06-18 13 views
9

Questa è probabilmente una richiesta insolita, ma per il mio script ho bisogno di una funzione che aumenti per lettera anziché per numero. Per esempio:Contare con A, B, C, D invece di 0, 1, 2, 3, ... con JavaScript

Questo è un esempio numerico:

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

In sostanza, voglio contare con le lettere, come Microsoft Excel fa, al posto dei numeri. Quindi, invece di stampare "Siamo a 0", "Siamo a 1", "Siamo a 2", ecc., Ho bisogno di stampare "Siamo a A", "Siamo a B", "Siamo a C ", ecc.

Per simulare Excel (l'unico esempio a cui riesco a pensare), dopo aver raggiunto l'indice 25 (Z), è possibile passare a" AA "," AB "," CA ", ecc.

quindi sarebbe grande lavoro in questo modo:

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

Ancora meglio se qualcuno può scrivere una funzione che converte poi una lettera di nuovo in una cifra, vale a dire ToNumber ('a') = 0 o ToNumber ('DC ') = 107 (penso).

Grazie!

+2

Scusate chiedendo, ma cosa hai provato? Finora mi sembra un compito a casa. – alf

+0

Quindi è necessario scrivere su Number() e su Lettera(). Questa sembra una ricerca algoritmica molto semplice. Mostraci cosa hai provato –

+0

È possibile creare una matrice di lettere e quindi confrontare il proprio conteggio con la chiave nell'array (assicurandosi di compensare la posizione "0"). Se il tuo conteggio inizia a zero, allora sei a posto. – gtr1971

risposta

0

Creare una matrice di lettere A, B, C, D, ecc. Quindi chiamare A utilizzando l'array [0] poiché 0 è l'indice di A è possibile utilizzare l'array [i] come indice, basta convalidare così io non può essere più di 25.

utilizzare uno di questi modi per creare la matrice:

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

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

invece di toLetter(i); uso alphabet[i];

+0

Non penso che lo farei in questo modo, ma se lo facessi, creerei una stringa con tutti i caratteri dell'alfabeto. JavaScript ti consente di accedere ai caratteri di una stringa con notazione array. Inoltre: non è necessario pre-allocare lo spazio in un array tramite il costruttore Array; in realtà non farà nulla in qualsiasi runtime moderno. – Pointy

+0

Hai ragione, sono un po 'JavaScript arrugginito. – erran

2

Qualcosa del genere vuoi dire?

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 consente di indicizzare le stringhe come se fossero array, quindi non è necessario '.split()'. – Pointy

+0

hai ragione. Il codice era uno snippet veloce e sporco. – KooiInc

+0

@Pointy: spostato qui il mio commento poiché è più pertinente. Il '.split()' è necessario per il bene di IE * (8 e sotto penso) *. Altrimenti avresti bisogno di '.charAt()'. –

0

Provare quanto segue. Provato e testato in pochi minuti

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

Ecco una semplice funzione ricorsiva per convertire i numeri alle lettere.

È basato su uno, quindi 1 è A, 26 è Z, 27 è 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; 
} 

Ecco una funzione di matching per convertire le stringhe di nuovo ai numeri:

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

un test: http://jsfiddle.net/St6c9/

+0

Quasi. La terza riga dovrebbe essere 'var out = String.fromCharCode (65 + (num% 26));' Altrimenti sarà basato su zero. –

+0

@Jules era piuttosto rotto ... dimmi cosa ne pensi adesso :) –

+0

dolce. bel violino –

0

Ecco come è possibile generare lettere casuali:

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 non vuole lettere casuali, lui/lei vuole sequenziale come in excel – MotKohn

Problemi correlati