Skip to content

Instantly share code, notes, and snippets.

@evaqas
Last active June 23, 2023 11:48
Show Gist options
  • Save evaqas/63fa204e3a1f0019bce2 to your computer and use it in GitHub Desktop.
Save evaqas/63fa204e3a1f0019bce2 to your computer and use it in GitHub Desktop.
Skaičiai žodžiais, suma žodžiais
<?php
function skaicius_zodziais( $skaicius ) {
// neskaiciuosim neigiamu ir itin dideliu skaiciu (iki milijardu)
if ( $skaicius < 0 || strlen( $skaicius ) > 9 ) return;
if ( $skaicius == 0 ) return 'nulis';
$vienetai = array( '', 'vienas', 'du', 'trys', 'keturi', 'penki', 'šeši', 'septyni', 'aštuoni', 'devyni' );
$niolikai = array( '', 'vienuolika', 'dvylika', 'trylika', 'keturiolika', 'penkiolika', 'šešiolika', 'septyniolika', 'aštuoniolika', 'devyniolika' );
$desimtys = array( '', 'dešimt', 'dvidešimt', 'trisdešimt', 'keturiasdešimt', 'penkiasdešimt', 'šešiasdešimt', 'septyniasdešimt', 'aštuoniasdešimt', 'devyniasdešimt' );
$pavadinimas = array(
array( 'milijonas', 'milijonai', 'milijonų' ),
array( 'tūkstantis', 'tūkstančiai', 'tūkstančių' ),
);
$skaicius = sprintf( '%09d', $skaicius ); // iki milijardu 10^9 (milijardu neskaiciuosim)
$skaicius = str_split( $skaicius, 3 ); // kertam kas tris simbolius
$zodziais = array();
foreach ( $skaicius as $i => $tripletas ) {
// resetinam linksni
$linksnis = 0;
// pridedam simtu pavadinima, jei pirmas tripleto skaitmuo > 0
if ( $tripletas{0} > 0 ) {
$zodziais[] = $vienetai[ $tripletas{0} ];
$zodziais[] = ( $tripletas{0} > 1 ) ? 'šimtai' : 'šimtas';
}
// du paskutiniai tripleto skaiciai
$du = substr( $tripletas, 1 );
// pacekinam nioliktus skaicius
if ( $du > 10 && $du < 20 ) {
$zodziais[] = $niolikai[ $du{1} ];
$linksnis = 2;
} else {
// pacekinam desimtis
if ( $du{0} > 0 ) {
$zodziais[] = $desimtys[ $du{0} ];
}
// pridedam vienetus
if ( $du{1} > 0 ) {
$zodziais[] = $vienetai[ $du{1} ];
$linksnis = ( $du{1} > 1 ) ? 1 : 0;
} else {
$linksnis = 2;
}
}
// pridedam pavadinima isskyrus paskutiniam ir nuliniams tripletams
if ( $i < count( $pavadinimas ) && $tripletas != '000' ) {
$zodziais[] = $pavadinimas[ $i ][ $linksnis ];
}
}
return implode( ' ', $zodziais );
}
function valiutos_galune( $number, $saknis = 'eur' ) {
if ( $number < 0 || strlen( $number ) > 9 ) return;
if ( $number == 0 ) {
return $saknis . 'ų';
}
$last = substr( $number, -1 );
$du = substr( $number, -2, 2 );
if ( ($du > 10) && ($du < 20) ) {
return $saknis . 'ų';
} else {
if ( $last == 0 ) {
return $saknis . 'ų';
} elseif ( $last == 1 ) {
return $saknis . 'as';
} else {
return $saknis . 'ai';
}
}
}
// pasitestavimui
for ($i=1; $i < 9; $i++) {
$sk = rand(0, 19);
$sk = $sk * pow(10, $i);
for ($j=0; $j < $i; $j++) {
$rand = rand(0, 9);
$sk += $rand * pow(10, $j);
}
var_dump( $sk );
var_dump( skaicius_zodziais( $sk ) . ' ' . valiutos_galune( $sk ) );
echo '<hr>';
}
@aurelijusrozenas
Copy link

aurelijusrozenas commented Jan 19, 2017

  • if ( $skaicius <= 0 || strlen( $skaicius ) > 9 ) return; turi būti if ( $skaicius < 0 || strlen( $skaicius ) > 9 ) return;
  • taip pat siūlyčiau mesti exception, jei neskaičiuoji, pvz.,
if ($skaicius < 0 || strlen($skaicius) > 9) {
    throw new \Exception(sprintf('Not implemented for number "%s".', $skaicius));
}

@evaqas
Copy link
Author

evaqas commented Feb 11, 2017

Yep, dėkui.

@sammyaxe
Copy link

butu super iterpti ir centu palaikyma.

@tadas-subonis
Copy link

@vdxas
Copy link

vdxas commented Sep 14, 2021

`
public static function valiutos_galune($number, $saknis = 'eur'){

    if ($number < 0 || strlen($number) > 9) return;

    if (floor($number) == 0) {
        return $saknis . 'ų '. round(round(($number - floor($number)) * 100)) . ' ct.';
    }

    $last = substr(floor($number), -1);
    $du = substr(floor($number), -2, 2);

    if (($du > 10) && ($du < 20)) {
        return $saknis . 'ų '. round(round(($number - floor($number)) * 100)) . ' ct.';
    } else {
        if ($last == 0) {
            return $saknis . 'ų '. round(round(($number - floor($number)) * 100)) . ' ct.' ;
        } elseif ($last == 1) {
            return $saknis . 'as '. round(($number - floor($number)) * 100) . ' ct.' ;
        } else {
            return $saknis . 'ai '. round(($number - floor($number)) * 100) . ' ct.' ;
        }
    }

}

`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment