Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Automatyczne Generowanie Liczb Słownie (?)
Forum PHP.pl > Forum > Gotowe rozwiązania
karolski
Witam,

Ciężko wyjaśnić w temacie co ja cche ale mam problem z sytulacja po wpisaniu wartości (liczby np. 49) zeby mozna bylo automatycznie wygenerowac tą liczbe słownie to jest dziwne ale mi potrzebne czy ktos moze powiedziec jak cos takiego zrobic.
rolling_stone
Na przyklad tak (może długo, ale działa):

  1. <?php
  2.      function Nazwa_Liczby( $liczba, $typ )
  3.      {
  4.       $tablica[0] = &#092;"zer\";
  5.       $tablica[1] = &#092;"jed\";
  6.       $tablica[2] = &#092;"dwa\";
  7.       $tablica[3] = &#092;"trz\";
  8.       $tablica[4] = &#092;"czt\";
  9.       $tablica[5] = &#092;"pie\";
  10.       $tablica[6] = &#092;"sze\";
  11.       $tablica[7] = &#092;"sie\";
  12.       $tablica[8] = &#092;"osi\";
  13.       $tablica[9] = &#092;"dzi\";
  14.       $tablica[10] = &#092;"dziesięć\";
  15.       $tablica[20] = &#092;"dwadzieścia\";
  16.       $tablica[30] = &#092;"trzydzieści\";
  17.       $tablica[40] = &#092;"czterdzieści\";
  18.       $tablica[50] = &#092;"pięćdziesiąt\";
  19.       $tablica[60] = &#092;"sześćdziesiąt\";
  20.       $tablica[70] = &#092;"siedemdziesiąt\";
  21.       $tablica[80] = &#092;"osiemdziesiąt\";
  22.       $tablica[90] = &#092;"dziewięćdziesiąt\";
  23.       $tablica_pelne[0] = &#092;"zero\";
  24.       $tablica_pelne[1] = &#092;"jeden\";
  25.       $tablica_pelne[2] = &#092;"dwa\";
  26.       $tablica_pelne[3] = &#092;"trzy\";
  27.       $tablica_pelne[4] = &#092;"cztery\";
  28.       $tablica_pelne[5] = &#092;"pięć\";
  29.       $tablica_pelne[6] = &#092;"sześć\";
  30.       $tablica_pelne[7] = &#092;"siedem\";
  31.       $tablica_pelne[8] = &#092;"osiem\";
  32.       $tablica_pelne[9] = &#092;"dziewięć\";
  33.       $tablica_pelne[11] = &#092;"jedenaście\";
  34.       $tablica_pelne[12] = &#092;"dwanaście\";
  35.       $tablica_pelne[13] = &#092;"trzynaście\";
  36.       $tablica_pelne[14] = &#092;"czternaście\";
  37.       $tablica_pelne[15] = &#092;"piętnaście\";
  38.       $tablica_pelne[16] = &#092;"szesnaście\";
  39.       $tablica_pelne[17] = &#092;"siedemnaście\";
  40.       $tablica_pelne[18] = &#092;"osiemnaście\";
  41.       $tablica_pelne[19] = &#092;"dziewiętnaście\";
  42.       $tablica_pelne[10] = &#092;"dziesięć\";
  43.       $tablica_pelne[20] = &#092;"dwadzieścia\";
  44.       $tablica_pelne[30] = &#092;"trzydzieści\";
  45.       $tablica_pelne[40] = &#092;"czterdzieści\";
  46.       $tablica_pelne[50] = &#092;"pięćdziesiąt\";
  47.       $tablica_pelne[60] = &#092;"sześćdziesiąt\";
  48.       $tablica_pelne[70] = &#092;"siedemdziesiąt\";
  49.       $tablica_pelne[80] = &#092;"osiemdziesiąt\";
  50.       $tablica_pelne[90] = &#092;"dziewięćdziesiąt\";
  51.       $tablica_pelne[100] = &#092;"sto\";
  52.       $tablica_pelne[200] = &#092;"dwieście\";
  53.       $tablica_pelne[300] = &#092;"trzysta\";
  54.       $tablica_pelne[400] = &#092;"czterysta\";
  55.       $tablica_pelne[500] = &#092;"pięćset\";
  56.       $tablica_pelne[600] = &#092;"sześćset\";
  57.       $tablica_pelne[700] = &#092;"siedemset\";
  58.       $tablica_pelne[800] = &#092;"osiemset\";
  59.       $tablica_pelne[900] = &#092;"dziewięćset\";
  60.       if($typ == 0)
  61.       {
  62.        return $tablica[$liczba];
  63.       }
  64.       else
  65.       {
  66.        return $tablica_pelne[$liczba];
  67.       }
  68.      }
  69.      function Kwota_Slownie( $kwota, $typ )
  70.      {
  71.  
  72.       $kwota_slownie = &#092;"\";
  73.       $kwota_kopia = $kwota;
  74.       $setne = 0;
  75.       $dziesietne = 0;
  76.       $grosze_d = 0;
  77.       $grosze_j = 0;
  78.       $grosze_txt = &#092;"\";
  79.       // zapamiętujemy część setną i dziesiętną
  80.       while($kwota_kopia >=)
  81.       {
  82.        $kwota_kopia--;
  83.        $dziesietne++;
  84.       }
  85.       $setne = sprintf(&#092;"%00.0f\",$kwota_kopia * 100);
  86.       $setne_kopia = $setne;
  87.       while($setne_kopia >= 10)
  88.       {
  89.        $grosze_d++;
  90.        $setne_kopia = $setne_kopia - 10;
  91.       }
  92.       $grosze_j = $setne_kopia;
  93.       if(($grosze_j == 0 || $grosze_j > 4) && ($grosze_d == 1))
  94.       {
  95.        $grosze_napis = &#092;"groszy\";
  96.       }
  97.       else if($grosze_j == 1 || $grosze_d == 0)
  98.       {
  99.        $grosze_napis = &#092;"grosz\";
  100.       }
  101.       else
  102.       {
  103.        $grosze_napis = &#092;"grosze\";
  104.       }
  105.       $grosze_txt = Nazwa_Liczby($grosze_d,0) . &#092;"*\" . Nazwa_Liczby($grosze_j,0) . \"*gr\";
  106.       //----------------------------------------------------
  107.       $dziesietne_kopia = $dziesietne;
  108.       while($dziesietne > 10)
  109.       {
  110.        $dziesietne = $dziesietne - 10;
  111.       }
  112.       $dziesietne_j = $dziesietne;
  113.       if($dziesietne_j == 10)
  114.       {
  115.        $dziesietne_j = 0;
  116.       }
  117.       $dziesietne = $dziesietne_kopia / 10;
  118.       while($dziesietne > 10)
  119.       {
  120.        $dziesietne = $dziesietne - 10;
  121.       }
  122.       $dziesietne_mniej = sprintf(&#092;"%01.0f\",$dziesietne);
  123.       if($dziesietne_mniej > $dziesietne)
  124.       {
  125.        $dziesietne = sprintf(&#092;"%01.0f\",$dziesietne) - 1;
  126.       }
  127.       else
  128.       {
  129.        $dziesietne = sprintf(&#092;"%01.0f\",$dziesietne);
  130.       }
  131.       $dziesietne_d = $dziesietne;
  132.       //
  133.       $dziesietne = $dziesietne_kopia / 100;
  134.       while($dziesietne > 10)
  135.       {
  136.        $dziesietne = $dziesietne - 10;
  137.       }
  138.       $dziesietne_mniej = sprintf(&#092;"%01.0f\",$dziesietne);
  139.       if($dziesietne_mniej > $dziesietne)
  140.       {
  141.        $dziesietne = sprintf(&#092;"%01.0f\",$dziesietne) - 1;
  142.       }
  143.       else
  144.       {
  145.        $dziesietne = sprintf(&#092;"%01.0f\",$dziesietne);
  146.       }
  147.       $dziesietne_s = $dziesietne;
  148.       //
  149.       $dziesietne = $dziesietne_kopia / 1000;
  150.       $dziesietne_form = sprintf(&#092;"%01.0f\",$dziesietne);
  151.       if($dziesietne_form > $dziesietne)
  152.       {
  153.        $dziesietne_ty = $dziesietne_form - 1;
  154.       }
  155.       else
  156.       {
  157.        $dziesietne_ty = $dziesietne_form;
  158.       }
  159.       //
  160.       $dziesietne_t_txt = Nazwa_Liczby($dziesietne_ty,0);
  161.       $dziesietne_s_txt = Nazwa_Liczby($dziesietne_s,0);
  162.       $dziesietne_d_txt = Nazwa_Liczby($dziesietne_d,0);
  163.       $dziesietne_j_txt = Nazwa_Liczby($dziesietne_j,0);
  164.       if(empty($dziesietne_t_txt) || $dziesietne_t_txt == &#092;"zer\")
  165.       {
  166.        if(empty($dziesietne_s_txt) || $dziesietne_s_txt == &#092;"zer\")
  167.        {
  168.         if(empty($dziesietne_d_txt) || $dziesietne_d_txt == &#092;"zer\")
  169.         {
  170.          $dziesietne_txt = &#092;"$dziesietne_j_txt*zł*\";
  171.         }
  172.         else
  173.         {
  174.          $dziesietne_txt = &#092;"$dziesietne_d_txt*$dziesietne_j_txt*zł*\";
  175.         }
  176.        }
  177.        else
  178.        {
  179.         $dziesietne_txt = &#092;"$dziesietne_s_txt*$dziesietne_d_txt*$dziesietne_j_txt*zł*\";
  180.        }
  181.       }
  182.       else
  183.       {
  184.        $dziesietne_txt = &#092;"$dziesietne_t_txt*$dziesietne_s_txt*$dziesietne_d_txt*$dziesietne_j_txt*zł*
    \";
  185.       }
  186.       /* $dziesietne_txt = strtoupper($dziesietne_txt);
  187.       $grosze_txt = strtoupper($grosze_txt); */
  188.       if($typ == 0)
  189.       {
  190.        return &#092;"$dziesietne_txt$grosze_txt\";
  191.       }
  192.       else
  193.       {
  194.        if($grosze_d == 0)
  195.        {
  196.         $grosze_txt = Nazwa_Liczby($grosze_j , 1);
  197.         if($grosze_j == 1)
  198.         {
  199.          $gr_txt = &#092;"grosz\";
  200.         }
  201.         else if($grosze_j >= 2 && $grosze_j <= 4)
  202.         {
  203.          $gr_txt = &#092;"grosze\";
  204.         }
  205.         else
  206.         {
  207.          $gr_txt = &#092;"groszy\";
  208.         }
  209.        }
  210.        else if($grosze_d == 1)
  211.        {
  212.         $grosze_txt = Nazwa_Liczby($grosze_d*10+$grosze_j,1);
  213.         $gr_txt = &#092;"groszy\";
  214.        }
  215.        else
  216.        {
  217.         $grosze_txt = Nazwa_Liczby($grosze_d*10,1);
  218.         if($grosze_j != 0)
  219.         {
  220.          $grosze_txt .= &#092;" \" . Nazwa_Liczby($grosze_j,1);
  221.         }
  222.         if($grosze_j >= 2 && $grosze_j <= 4)
  223.         {
  224.          $gr_txt = &#092;"grosze\";
  225.         }
  226.         else
  227.         {
  228.          $gr_txt = &#092;"groszy\";
  229.         }
  230.        }
  231.        if($dziesietne_d == 0)
  232.        {
  233.         $dziesietne_txt = Nazwa_Liczby($dziesietne_j , 1);
  234.         if($dziesietne_j == 1)
  235.         {
  236.          $dz_txt = &#092;"złoty\";
  237.         }
  238.         else if($dziesietne_j >= 2 && $dziesietne_j <= 4)
  239.         {
  240.          $dz_txt = &#092;"złote\";
  241.         }
  242.         else
  243.         {
  244.          $dz_txt = &#092;"złotych\";
  245.         }
  246.        }
  247.        else if($dziesietne_d == 1)
  248.        {
  249.         $dziesietne_txt = Nazwa_Liczby($dziesietne_d*10+$dziesietne_j,1);
  250.         $dz_txt = &#092;"złotych\";
  251.        }
  252.        else
  253.        {
  254.         $dziesietne_txt = Nazwa_Liczby($dziesietne_d*10,1);
  255.         if($dziesietne_j != 0)
  256.         {
  257.          $dziesietne_txt .= &#092;" \" . Nazwa_Liczby($dziesietne_j,1);
  258.         }
  259.         if($dziesietne_j >= 2 && $dziesietne_j <= 4)
  260.         {
  261.          $dz_txt = &#092;"złote\";
  262.         }
  263.         else
  264.         {
  265.          $dz_txt = &#092;"złotych\";
  266.         }
  267.        }
  268.        if($dziesietne_s != 0 || !empty($dziesietne_s))
  269.        {
  270.         $setne_txt = Nazwa_Liczby($dziesietne_s*100,1) . &#092;" \";
  271.        }
  272.        return &#092;"$setne_txt$dziesietne_txt $dz_txt, $grosze_txt $gr_txt\";
  273.       }
  274.      }
  275. ?>



1. to jest skrypt dla kwot, ale można go zmodyfikować
2. możesz includować ten plik do skryptu php, a potem wywołać funkcję np. tak:

  1. <?php
  2. Kwota_Slownie(25.64,0); // zwróci \"dwa*pie*zł*sze*czt*gr\"
  3. Kwota_Slownie(25.64,1); // zwróci \"dwadzieścia pięć złotych sześćdziesiąt cztery grosze\"
  4. ?>
czy odwrotnie z tym 0 i 1 winksmiley.jpg
talee
A co gdy?
  1. <?php
  2.  
  3. echo Kwota_Slownie(1122225.64,0); // zwróci ?
  4. echo Kwota_Slownie(1122225.64,1); // zwróci ?
  5.  
  6. ?>

Proponuję zapoznać się z klasą Numbers_Words z pakietu PEAR znajdź na google.pl
  1. <?php
  2.  
  3. require_once('Numbers/Words.php');
  4.  
  5. echo Numbers_Words::toWords(1122225.64, 'pl');
  6.  
  7. ?>
rolling_stone
Cytat(talee @ 2004-08-28 17:13:35)
A co gdy?
  1. <?php
  2.  
  3. echo Kwota_Slownie(1122225.64,0); // zwróci ?
  4. echo Kwota_Slownie(1122225.64,1); // zwróci ?
  5.  
  6. ?>

Raczej nic winksmiley.jpg, bo gdy robiłem ten skrypt raczej kwota miliona złotych nie była mi potrzebna winksmiley.jpg.

Ale dzięki za tę klasę, gdybym o niej wiedział wcześniej zaoszczędziłbym parę godzin smile.gif.
DrOOcik
Klasa Numbers_Words z pakietu PEAR jest OK, ale czasem skrypt wymaga "pełnej przenośności" na dowolny server, w każdej chwili.
Przy instalacji nowej klasy należy zainstalować pakiet PEAR na danym serverze, no i potem klasę Number_Words.
I jeśli się o tym zapomni, skrypt się "wywala", bo nie zainstalowano klasy...

Czyli taki kodzik rolling'a się jednak przyda (dzięki, miałem coś takiego zrobić u siebie, ale nie miałem czasu - to fajnie, że jednak czasem ktoś sie dzieli swoimi rozwiązaniami).
Co z tego, że do tysiąca, w końcu można to szybko rozbudować dalej na setki tysięcy... a i ceny raczej oscylują własnie w tych granicach.

Można ewentulnie dodać warunek, że jak > 1000 to dawać gwiazdki na returnie i już. Bo... właśnie, jest mały bug:

Mam zmienną $suma, co jest typu double (wzięte z mysql) i mimo, że jest np. 14.50 to i tak funkcja "miele" i nic... Bo za dużo "cyferek" przed przecinkiem czy jakoś tak.
To samo się zawiesza własnie przy dużych sumach.

Wrzucałem taką zmienną do w/w skryptu i kicha: echo Kwota_Slownie($suma,1);

i mielił... Ale znalazłem prosty sposób (wręcz "debilny"):

Przy function Kwota_Slownie ($kwota,$typ)

$kwota_kopia = $kwota*100/100;

i już, sprawa załatwiona ;-)


[OT] W ogóle, z typem double, zmienneprzecinkowym jest kupa problemów, bo 0 nie zawsze równa się 0 (problem z zaokrąglaniem, dokładność po przecinku...), ale to raczej zupełnie inny temat. Bo po latach całkiem przypadkiem znalazłem taki bug i teraz jak porównuję dwie liczby double to przedtem je przez sprintf odpowiednio "kształtuję'. Nie mówiąc o zaokrągleniach. Tam też te liczby potrafią się dziwnie zachowywać.


Pozdr.
talee
Numbers_Words jest praktycznie niezależne od PEAR, oprócz metody raiseError. Wystarczy // * 2 i po kłopocie.
Zabija Nazwa_Liczby pod kątem wydajności i nie tylko smile.gif.
Odnośnie double wystarczy zastosować rzutowanie (Type Casting).
DrOOcik
Cytat(talee @ 2004-09-10 21:45:35)
Numbers_Words jest praktycznie niezależne od PEAR, oprócz metody raiseError. Wystarczy // * 2 i po kłopocie.
Zabija Nazwa_Liczby pod kątem wydajności i nie tylko smile.gif.
Odnośnie double wystarczy zastosować rzutowanie (Type Casting).

...Odnośnie double wystarczy zastosować rzutowanie (Type Casting)...

Nie bardzo rozumiem. Do jakiego typu mam rzutować? Double to double. Chodzi mi o ograniczoną zmiennoprzecinkową do np. 2 miejsc po przecinku. Float nieco ma ograniczoną dokładność, ale zawsze to zbyt dużo.

Pozdr.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.