2012-06-18 9 views
9

Jest to prawdopodobnie nietypowa prośba, ale dla mojego skryptu potrzebuję funkcji, która zwiększa się o literę zamiast liczby. Na przykład:Licz się z A, B, C, D zamiast 0, 1, 2, 3, ... z JavaScript

Jest to przykład liczbowy:

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

Zasadniczo, chcę liczyć z literami, jak robi Microsoft Excel, zamiast numerów. Więc zamiast drukować "Jesteśmy na 0", "Jesteśmy na 1", "Jesteśmy na 2", itp., Muszę wydrukować "Jesteśmy w A", "Jesteśmy w B", "Jesteśmy w C ", itp.

Aby naśladować Excel (jedyny przykład, jaki mogę wymyślić), po osiągnięciu indeksu 25 (Z), możemy przejść do" AA "," AB "," AC "itp.

tak to działa świetnie tak:

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

nawet lepiej, jeśli ktoś może napisać funkcję, która następnie przekształca do nas z powrotem do cyfry, tj toNumber ('a') = 0 lub toNumber ("DC ") = 107 (myślę).

Dzięki!

+2

Przepraszamy za pytając, ale czego próbowałeś? Jak dotąd wygląda to dla mnie jak zadanie domowe. – alf

+0

Musisz więc napisać do Number() i doLetter(). To wygląda na bardzo proste zadanie algorytmiczne. Pokaż nam, co próbowałeś. –

+0

Można zbudować tablicę liter, a następnie porównać liczbę z kluczem w tablicy (zwracając uwagę, aby zrekompensować pozycję "0"). Jeśli twoja liczba zaczyna się od zera, jesteś dobry. – gtr1971

Odpowiedz

0

Utwórz tablicę liter A, B, C, D itd., A następnie wywołaj A używając tablicy [0], ponieważ 0 jest indeksem A, możesz użyć tablicy [i] jako indeksu, po prostu sprawdź, czy nie może być ponad 25.

użyć jednej z tych sposobów tworzenia tablicy:

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

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

zamiast toLetter(i); użycie alphabet[i];

+0

Nie sądzę, że zrobiłbym to w ten sposób, ale gdybym to zrobił, zrobiłbym ciąg znaków zawierający wszystkie znaki alfabetu. JavaScript umożliwia dostęp do znaków ciągu z notacją tablicową. Ponadto: nie ma potrzeby wstępnego przydzielania miejsca w tablicy za pomocą konstruktora Array; w rzeczywistości nic nie zrobi w żadnym nowoczesnym środowisku uruchomieniowym. – Pointy

+0

Masz rację, jestem trochę zardzewiały JavaScript. – erran

2

coś takiego na myśli?

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 umożliwia indeksowanie ciągów tak, jakby były tablicami, więc naprawdę nie ma potrzeby ".split()". – Pointy

+0

masz rację. Kod był szybkim i brudnym fragmentem. – KooiInc

+0

@Pointy: Przeniesiono tutaj komentarz, ponieważ jest bardziej trafny. '.split()' jest potrzebne ze względu na IE * (8 i poniżej myślę) *. W przeciwnym razie potrzebujesz '.charAt()'. –

0

Spróbuj wykonać następujące czynności. Wypróbowane i przetestowane w ciągu kilku minut

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

Oto prosty rekurencyjna funkcja do zamiany liczb na litery.

Jest oparty na jednym, więc 1 to A, 26 to Z, 27 to 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; 
} 

Oto funkcja dopasowywania do konwersji ciągów powrotem do numerów:

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

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

+0

Prawie. Trzeci wiersz powinien być 'var out = String.fromCharCode (65 + (num% 26)); w przeciwnym razie będzie oparty na zera. –

+0

@Jules to było bardzo źle zepsute ... powiedz mi co teraz o tym myślisz :) –

+0

słodko. fajne skrzypce –

0

Ów sposób można generować losowe litery:

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 nie chce losowych liter, on/ona chce sekwencyjny jak w Excelu – MotKohn

Powiązane problemy