Dar vieno analitiko svetainė

Petras Kudaras

Num2LTWord Perlu

Kai kam prireikė funkcijos, kuri
verstų skaičius į lietuvių kalbą. Tad parašiau Perlinį moduliuką –
gal bus dar kam nors naudingas. (Parsiųsti kaip normalų modulį galima iš
čia)

#!/usr/bin/perl -w
package Num2LTWord;

=head1 Num2LTWord -- skaičiai lietuviškai

Modulis verčiantis (sveikus) skaičius į lietuvių kalbą

=head2 NAUDOJIMAS

    use Num2LTWord;
    num2ltword(2003);

=head2 FUNKCIJOS

=head3 num2ltword ( skaičius )

Ši funkcija grąžina suformuotą lietuvišką skaičiaus pavadinimą.

=head2 RIKTAI IR APRIBOJIMAI

Funkcija C<num2ltword> supranta tik sveikus skaičius intervale
(- 1 000 000 000; 1 000 000 000)

=head2 AUTORIUS

Petras Kudaras aka moxliukas (moxliukas@delfi.lt)

=cut

use strict;
use warnings;
use Exporter;
our @ISA = qw/Exporter/;
our @EXPORT = qw/num2ltword/;
our $VERSION = 0.02;

sub num2ltword {
    my $ka = shift;
    my $result = '';

    return "Nežinau kaip čia paverst" unless $ka eq int($ka);
    return "nulis" if $ka == 0;
    my $kam = abs $ka;
    $result .= "minus " if $ka < 0;
    if($kam >= 1_000_000_000) {
        return "Per didelis man čia skaičius";
    } else {
        $result .= __iki1e9($kam);
        $result =~ s/\s+$//;
        $result =~ s/\s+/ /g;
        return $result;
    }
}

sub __iki10 {
    my $ka = shift;
    my @skaitmenys =     ("", "vienas", "du",
                 "trys", "keturi", "penki",
                 "šeši", "septyni", "aštuoni",
                 "devyni", "dešimt");
    return $skaitmenys[$ka];
}

sub __iki20 {
    my $ka = shift;
    my @lika =     ("vienuolika", "dvylika", "trylika",
             "keturiolika", "penkiolika", "šešiolika",
             "septyniolika", "aštuoniolika", "devyniolika");
    if ($ka <= 10) {
        return __iki10($ka);
    } else {
        return $lika[$ka % 10 - 1];
    }
}

sub __iki100 {
    my $ka = shift;
    my @desimt = ("", "", "dvi", "tris", "keturias", "penkias",
            "šešias", "septynias", "aštuonias", "devynias");
    if ($ka < 20) {
        return __iki20($ka);
    } else {
        if($ka % 10 == 0) {
            return $desimt[int($ka/10)] . "dešimt";
        } else {
            return $desimt[int($ka/10)] . "dešimt " . __iki10($ka % 10);
        }
    }
}

sub __iki1000 {
    my $ka = shift;
    return __iki100($ka) if ($ka < 100);
    if(int($ka / 100) == 1) {
        return __iki10(int($ka/100)) . " šimtas " . __iki100($ka % 100);
    } else {
        return __iki10(int($ka/100)) . " šimtai " . __iki100($ka % 100);
    }
}

sub __iki1e6 {
    my $ka = shift;
    return __iki1000($ka) if ($ka < 1000);
    my $t = __iki1000(int($ka/1000));
    if ($t =~ /vienas$/) {
        return "$t tūkstantis " . __iki1000($ka % 1000);
    } elsif ($t =~ /(?:lika|šimtai|imt)\s*$/) {
        return "$t tūkstančių " . __iki1000($ka % 1000);
    } else {
                return "$t tūkstančiai " . __iki1000($ka % 1000);
    }
}

sub __iki1e9 {
    my $ka = shift;
        return __iki1e6($ka) if ($ka < 1_000_000);
        my $t = __iki1e6(int($ka/1_000_000));
        if ($t =~ /vienas$/) {
                return "$t milijonas " . __iki1e6($ka % 1_000_000);
        } elsif ($t =~ /(?:šimtai|lika|imt)\s*$/) {
                return "$t milijonų " . __iki1e6($ka % 1_000_000);
        } else {
                return "$t milijonai " . __iki1e6($ka % 1_000_000);
        }
}                                                   
1;