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.

comments powered by Disqus