joi, 19 martie 2009

Dincolo de ploi...


Odyssey - Dincolo de ploi

Pe drumuri ascunse, prin munţi şi prin văi,
Se-ntoarce acasă un călător pribeag…
Şi noaptea atârnă pe umerii săi,
În lume-a plecat pe calul său pag…

Îl poartă-napoi sufletul însetat
Îl arde-n adânc ca un izvor nesecat…

Pe drum s-a oprit la o poartă, să ceară adăpost,
Căci de nopţi întregi rătăceşte fără nici un rost,
Veşmântul i-e rupt şi calul e mort…

Refren
Se grăbeşte s-ajungă dincolo de ploi
Dar până atunci mai înfruntă furtuni şi noroi,
Printre văpăi de fulgere de tunete,
E-un fulger şi el, e-un tunet şi el…

Mai este puţin şi are s-ajungă
Zâmbeşte în gând şi-şi vede de drum
Şi nu are nimeni curajul să-i spună,
Să-i spună că de-acolo să te-ntorci n-ai cum…

Dar el nu are de gând să se-ntoarcă…
Mai face un pas şi iată-l a ajuns la poarta…

Şi strigă vântului să se deschidă,
Şi mantia-i de pe umeri se preschimbă în hlamidă,
Căci el e regele de dincolo de ploi…

Refren
Se grăbeşte s-ajungă dincolo de ploi
Dar până atunci mai înfruntă furtuni şi noroi,
Printre văpăi de fulgere de tunete,
E-un fulger şi el, e-un tunet şi el…

marți, 10 martie 2009

Conversie numar la litere

Am cautat pe Internet zilele astea, din necesitate mai mult decat din curiozitate, o metoda PHP care sa imi "traduca" un numar la formatul sau in litere (pentru completarea automata a unor documente). Din pacate, singura implementare de genul asta pe care am gasit-o functioneaza aproape oribil... Asa ca am scris eu una, pe care o postez aici, cu toate explicatiile necesare. Sper sa fie de folos cuiva (daca este, lasati si voi un comentariu cu opinia asupra codului).
<?php

/**
* Clasa face transpunerea numerelor in cuvinte
* E dezvoltata doar pentru limba ROMANA
**/
class NConv {

/**
* Methoda de separare a grupurilor de 3 cifre, si conversie (functie de nivel)
* Va returna [NaN] daca parametrul de intrare $num nu e numeric
* Va returna [huge] daca numarul este mai mare decat 999.999.999.999
* Parametrul $sep e utilizat pentru a specifica separatorul cuvintelor
* Rezultatul metodei este numarul in cuvinte (daca $sep nu e specificat, va fi un singur cuvant)
**/
function sirDeLitere($num, $sep = '') {
$num = strval($num);
if ($num == "0") return "zero";
for ($i = 0; $i < strlen($num); ++$i) if (!is_numeric($num[$i])) return "[NaN]";
if (strlen($num) > strlen("999999999999")) return "[huge]";
$conv = ""; $level = 0; $current = "";
while (strlen($num) > 0) {
if (strlen($num) > 3) {
$current = substr($num, (strlen($num) - 3));
$num = substr($num, 0, strlen($num) - 3);
} else {
$current = $num;
$num = "";
}
$crt = ($current != "000") ? $this->convGroup($current,$level, $sep) : '';
$conv = $crt.$conv;
++$level;
}
return $conv;
}

/**
* Methoda de conversie a grupurilor de 3 cifre
**/
function convGroup($nr, $level, $sep = '') {
$val = intval($nr);
if ($val == 0) return "";
$decun = $val % 100;
$hndr = floor($val / 100);
$levels = array(
'single' => array('', 'mie', 'milion', 'miliard'),
'many' => array('', 'mii', 'milioane', 'miliarde')
);
// Sufixul grupului
$sfx = $levels[($val == 1) ? 'single' : 'many'][$level];
// Diverse forme pe care numerele le pot lua, utilizate mai jos in functie de caz
$digits = array(
array("", "unu", "doi", "trei", "patru", "cinci", "sase", "sapte", "opt", "noua"),
array("", "un", "doua", "trei", "patru", "cinci", "sase", "sapte", "opt", "noua"),
array("", "o", "doua", "trei", "patru", "cinci", "sase", "sapte", "opt", "noua"),
array("", "un", "doi", "trei", "patru", "cinci", "sai", "sapte", "opt", "noua"),
array("", "un", "doua", "trei", "patru", "cinci", "sai", "sapte", "opt", "noua"),);
// Mai jos e algoritmul de conversie asa cum l-am gandit eu (admit ca nu e perfect, dar isi face treaba)
$text = $digits[2][$hndr].$sep.(($hndr == 1) ? 'suta' : (($hndr > 1) ? 'sute' : '')).$sep;
if ($decun == 0)  return $text.$sep.$sfx.$sep;
if ($decun < 10)  return $text.$digits[(($level == 0) ? 0 : (($level == 1) ? ($hndr > 0 ? 0 : 2) : 3))][$decun].$sep.$sfx.$sep;
if ($decun == 10) return $text.'zece'.$sep.$sfx.$sep;
if ($decun < 20)  return $text.$digits[3][$decun%10].'sprezece'.$sep.$sfx.$sep;
return $text.$digits[4][$decun/10].'zeci'.$sep.(($decun % 10) == '0' ? '' : ('si'.$sep.$digits[0][$decun % 10].$sep)).(($level > 0) ? ('de'.$sep) : '').$sfx.$sep;
}
}

// Run a test...
$ncv = new NConv();
echo $ncv->sirDeLitere(123456,' ');

?>