Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [php] Automatyczne Generowanie Liczb Słownie (?)
karolski
post
Post #1





Grupa: Zarejestrowani
Postów: 199
Pomógł: 0
Dołączył: 12.02.2004
Skąd: Czymiasto

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
rolling_stone
post
Post #2





Grupa: Zarejestrowani
Postów: 46
Pomógł: 2
Dołączył: 20.08.2004
Skąd: Warszawa Grochów

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował rolling_stone 28.08.2004, 16:50:18
Go to the top of the page
+Quote Post
talee
post
Post #3





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 7.09.2002
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
rolling_stone
post
Post #4





Grupa: Zarejestrowani
Postów: 46
Pomógł: 2
Dołączył: 20.08.2004
Skąd: Warszawa Grochów

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) , bo gdy robiłem ten skrypt raczej kwota miliona złotych nie była mi potrzebna (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) .

Ale dzięki za tę klasę, gdybym o niej wiedział wcześniej zaoszczędziłbym parę godzin (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .
Go to the top of the page
+Quote Post
DrOOcik
post
Post #5





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 10.09.2004

Ostrzeżenie: (0%)
-----


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.

Ten post edytował DrOOcik 10.09.2004, 22:47:47
Go to the top of the page
+Quote Post
talee
post
Post #6





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 7.09.2002
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) .
Odnośnie double wystarczy zastosować rzutowanie (Type Casting).
Go to the top of the page
+Quote Post
DrOOcik
post
Post #7





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 10.09.2004

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 22:05