Számok más karakterkészlettel
A Counting with an Arbitrary Character Set című blogbejegyzés után gondoltam csinálok egy saját kis függvényt, ami egy számot egy tetszőleges 1 - 16-ig terjedő számrendszerbe konvertálja, miközben átalakítja a használta karaktereket egy másik készletre a hagyományosan használt 0, 1, 2... E, F
helyett.
Tudom nem nagy szám, de gondoltam azért megosztom azokkal, akik esetleg erre tévednek:
/**
* Átkonvertál egy tetszőleges számot egy más számrendszerbe klingon számokat használva.
*
* @param {Number} num
* Az átkonvertálandó szám
* @param {Number} [num=10]
* Egy egész szám, ami megadja a cél számrendszert 1 - 16 között.
* @returns {String}
* Az átkonvertált szám klingon stringként.
*/
function convert(num, base) {
var lexicon = {
0 : '\u0391',
1 : '\u0392',
2 : '\u0393',
3 : '\u0394',
4 : '\u0395',
5 : '\u0396',
6 : '\u0397',
7 : '\u0398',
8 : '\u0399',
9 : '\u039a',
A : '\u039b',
B : '\u039c',
C : '\u039d',
D : '\u039e',
E : '\u039f',
F : '\u03a0'
},
numStr, i = 0, l, output = '';
base = Math.max(Math.min(16, (base && +base | 0) || 10), 1);
for (numStr = (+num | 0).toString(base).toUpperCase(), l = numStr.length; i < l; i += 1) {
output += lexicon[numStr.charAt(i)] || numStr.charAt(i);
}
return output;
}
Azért maga a kód tartalmaz pár érdekességet. Először is előkészítjük a szótárat, ami majd az átalakításhoz kell, majd a többi szükséges változót.
A 32. sor azonban egy kicsit kacifántos lehet, ugyanis itt normalizáljuk a számrendszert. Először is megnézzük, hogy egyáltalán kapott-e a függvény számrendszert, ha igen, akkor számmá alakítja ( +base
), majd egésszé. A base | 0
azért alakítja egésszé, mert minden bináris művelet csak egész számokon végezhető, ezért a JavaScript motor a számot előbb átalakítja, majd csak utána hajtja végre rajta a műveletet, ami ebben az esetben nem csinál semmit.
Ha nem kapott a függvény számrendszer értéket, vagy az nem szám, illetve 0, akkor egyszerűen 10-re kényszerítjük.
Ezután a számot az 1 és 16 közötti tartományba kényszerítjük, azzal, hogy a minimális értékét 1-re a maximumot pedig 16-ra állítjuk.
A for
ciklusban előkészítjük a változókat - a számot az előbbinek megfelelően egész számmá alakítjuk, majd átalakítjuk a megadott számrendszerbe. Nincs is más hátra, mint karakterenként - amennyiben létezik a karakter a szótárban -, belepakoljuk a kimenetbe.