Skip to content

Instantly share code, notes, and snippets.

@lkraav
Created December 20, 2010 14:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lkraav/748434 to your computer and use it in GitHub Desktop.
Save lkraav/748434 to your computer and use it in GitHub Desktop.
this gist implements converting numbers into estonian language text. i'm using it as a replacement for the distribution copy of sql-ledger (currently at 2.6.32) ee locale Num2text, which is broken either in the algorithm or implementation (test: 1078000).
#!/usr/bin/perl
# summad/arvud eesti keeles
# VB original provided by Tarmo Ko~lli [lennuki@hot.ee]
# PHP-sse ymberkirjut Jaanus Kase (terminus@privador.com)
# ausqna ma ei tea mis printsiibil see toimib :)
# aga sellegipoolest vqiks creditsid kuskil kasutades alles j2tta
# Perli versioon Martin Lillepuu <martin@lillepuu.com>
# täisarvu sqnelemine eesti keeles
use locale;
sub spell_number {
my($s) = @_;
my(@nn) = ("","üks","kaks","kolm","neli","viis","kuus","seitse","kaheksa","üheksa");
my(@jark) = ("","","kümmend","sada"," tuhat","kümmend","sada"," miljon","kümmend","sada");
my($outval) = '';
my($kr) = int($s);
my($mil) = int($s / 1000000);
my($tonn) = int(($s / 1000) - (1000 * $mil));
my($tekst) = $kr;
my($pik) = length($tekst);
my($teist) = 0;
for ($i = 0; $i < $pik; $i++) {
$koht = $pik - $i ;
$n0 = substr($tekst,$i,1);
if (($n0 == "1") && ($jark[$koht] eq "kümmend")) {
$teist = 1;
} else {
if ($teist) {
if ($n0 > 0) {
$outval .= $nn[$n0]."teist".$jark[$koht].' ';
} else {
$outval .= "kümme".$jark[$koht].' ';
}
$teist = 0;
} else {
if (($n0 > 0) || (($koht == 7) && ($mil > 0)) || (($koht == 4) && ($tonn > 0))) {
$outval .= $nn[$n0].$jark[$koht];
if (($koht == 7) && ($kr >= 2000000)) {
$outval .= 'it';
}
$outval .= ' ';
}
}
}
}
return $outval;
}
# krooni- ja sendisumma eesti keeles
sub sum_as_words_ee {
my($s) = @_;
my($outval) = '';
my($kr) = int($s);
my($sn) = $s - $kr;
if ($kr > 0) {
$outval = spell_number($kr);
$outval .= 'kroon';
if ($kr > 1) { $outval .= 'i'; }
$outval .= ' ja ';
}
$sent = int($sn * 100 + 0.5);
while (length($sent)<2) {
$sent = '0'.$sent;
}
$outval .= $sent.' senti';
return $outval;
}
1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment