Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2009-04-29 09:13:54

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

PHP - Kwota słownie - dziwny przypadek

Witam! Mamm taki dziwny przypadek odnośnie kwoty słownie w php.
Mam plik tekstowy w którym mam nieokreśloną liczbę lini z danymi i właśnie
w tałych polach liczby.
Np:
sdjashdjashdasjd 12
kjljlkjweqweqwe  17
dasjdhsaddhsjdd  123
itd.

Teraz tak - mam skrypt formularza w którym wpisuje interesującą mnie liczbę lini z cyframi do wyświetlenia:

czyli np  - wpisuję 15 klikam w przycisk i wyświetla mi sie na ekranie 15 lini tylko z cyframi
Robię to za pomoca kodu:

form.php

<form name="formularz" action="for.php" method="get">
wprowadz ilo¶ć:
<input type="text" name="numer" size="10"><br>
<br><center><input type="submit" value="wydrukuj na ekran" onclick="document.formularz.action='for.php';document.formularz.submit();"/></center>

zaś plik for.php
<?

$dana = $_GET['numer'];

for($i=0; $i< $dana; $i = $i+1)
$test = include('ksi.php');
{
    $test;
}

?>

a w ksi.php mam kod:
<?



$fd1 = fopen("tekst.csv","rw");
$wiersz1 = 0;
while(!feof($fd1))

{
  $dane1[$wiersz1] = substr(fgets($fd1,1024),72,20);

  $wiersz1++;
}

echo slownie($dane1[$i + 0]);

?>

i za pomocą tego wyrzuci mi tyle razy kod który wyświetla cyfrę (jak widać od 72 znaku - 20 znaków) schodząc do kolejnej lini ile mu wpisze w formularzu.

A chciałbym żeby wyświetlał mi te cyfry ale słownie.
Także mam taki skrypt:

<?php

if(!function_exists('str_split')){
  function str_split($string,$len = 1) {
        if ($len < 1) return false;
    for($i=0, $rt = Array();$i<ceil(strlen($string)/$len);$i++)
      $rt[$i] = substr($string, $len*$i, $len);
    return($rt);
  }
}

$slowa = Array(
  'minus',

  Array(
    'zero',
    'jeden',
    'dwa',
    'trzy',
    'cztery',
    'pięć',
    'sześć',
    'siedem',
    'osiem',
    'dziewięć'),

  Array(
    'dziesięć',
    'jedenaście',
    'dwanaście',
    'trzynaście',
    'czternaście',
    'piętnaście',
    'szesnaście',
    'siedemnaście',
    'osiemnaście',
    'dziewiętnaście'),

  Array(
    'dziesięć',
    'dwadzieścia',
    'trzydzieści',
    'czterdzieści',
    'pięćdziesiąt',
    'sześćdziesiąt',
    'siedemdziesiąt',
    'osiemdziesiąt',
    'dziewięćdziesiąt'),

  Array(
    'sto',
    'dwieście',
    'trzysta',
    'czterysta',
    'pięćset',
    'sześćset',
    'siedemset',
    'osiemset',
    'dziewięćset'),

  Array(
    'tysiąc',
    'tysiące',
    'tysięcy'),

  Array(
    'milion',
    'miliony',
    'milionów'),

  Array(
    'miliard',
    'miliardy',
    'miliardów'),

  Array(
    'bilion',
    'biliony',
    'bilionów'),

  Array(
    'biliard',
    'biliardy',
    'biliardów'),

  Array(
    'trylion',
    'tryliony',
    'trylionów'),

  Array(
    'tryliard',
    'tryliardy',
    'tryliardów'),

  Array(
    'kwadrylion',
    'kwadryliony',
    'kwadrylionów'),

  Array(
    'kwintylion',
    'kwintyliony',
    'kwintylionów'),

  Array(
    'sekstylion',
    'sekstyliony',
    'sekstylionów'),

  Array(
    'septylion',
    'septyliony',
    'septylionów'),

  Array(
    'oktylion',
    'oktyliony',
    'oktylionów'),

  Array(
    'nonylion',
    'nonyliony',
    'nonylionów'),

  Array(
    'decylion',
    'decyliony',
    'decylionów')
);

function odmiana($odmiany, $int){ // $odmiany = Array('jeden','dwa','pięć')
  $txt = $odmiany[2];
  if ($int == 1) $txt = $odmiany[0];
  $jednosci = (int) substr($int,-1);
  $reszta = $int % 100;
  if (($jednosci > 1 && $jednosci < 5) &! ($reszta > 10 && $reszta < 20))
    $txt = $odmiany[1];
  return $txt;
}

function liczba($int){ // odmiana dla liczb < 1000
  global $slowa;
  $wynik = '';
  $j = abs((int) $int);

  if ($j == 0) return $slowa[1][0];
  $jednosci = $j % 10;
  $dziesiatki = ($j % 100 - $jednosci) / 10;
  $setki = ($j - $dziesiatki*10 - $jednosci) / 100;

  if ($setki > 0) $wynik .= $slowa[4][$setki-1].' ';

  if ($dziesiatki > 0)
        if ($dziesiatki == 1) $wynik .= $slowa[2][$jednosci].' ';
  else
    $wynik .= $slowa[3][$dziesiatki-1].' ';

  if ($jednosci > 0 && $dziesiatki != 1) $wynik .= $slowa[1][$jednosci].' ';
  return $wynik;
}

function slownie($int){

  global $slowa;

  $in = preg_replace('/[^-\d]+/','',$int);
  $out = '';

  if ($in{0} == '-'){
    $in = substr($in, 1);
    $out = $slowa[0].' ';
  }

  $txt = str_split(strrev($in), 3);

  if ($in == 0) $out = $slowa[1][0].' ';

  for ($i = count($txt) - 1; $i >= 0; $i--){
    $liczba = (int) strrev($txt[$i]);
    if ($liczba > 0)
      if ($i == 0)
        $out .= liczba($liczba).' ';
          else
        $out .= ($liczba > 1 ? liczba($liczba).' ' : '')
          .odmiana( $slowa[4 + $i], $liczba).' ';
  }
  return trim($out);
}

function kwotaslownie($kwota){
  $kwota = explode(',', $kwota);

  $zl = preg_replace('/[^-\d]+/','', $kwota[0]);
  $gr = preg_replace('/[^\d]+/','', substr(isset($kwota[1]) ? $kwota[1] : 0, 0, 2));
  while(strlen($gr) < 2) $gr .= '0';

  echo slownie($zl) . ' ' . odmiana(Array('złoty', 'złote', 'złotych'), $zl) .
      (intval($gr) == 0 ? '' :
      ' ' . slownie($gr) . ' ' . odmiana(Array('grosz', 'grosze', 'groszy'), $gr));
}

?>

No i pod spodem ten wyciągający:

<?
$fd1 = fopen("tekst.csv","rw");
$wiersz1 = 0;
while(!feof($fd1))

{
  $dane1[$wiersz1] = substr(fgets($fd1,1024),72,20);

  $wiersz1++;
}

echo slownie($dane1[$i + 0]);

?>

oczywiście przekierowanie z for.php zrobiłem:

<?

$dana = $_GET['numer'];

for($i=0; $i< $dana; $i = $i+1)
$test = include('slownie.php');
{
    $test;
}

?>

I teraz sytuacja wygląda tak że gdy wpisuję sobię w formularzu liczbę i klikam w przycisk
to kod wyrzuca mi pierwszą linię zmieniąną cyfrę na słownie ( czyli dobrze )
a zaraz pod spodem:

Fatal error: Cannot redeclare odmiana() (previously declared in /var/www/slowne/slownie.php:134) in /var/www/slowne/slownie.php on line 142

Czyli jak by nie może sobie poradzić z przechodzeniem do kolejnej lini w pliku.

Ma ktoś jakis pomysł??

Ostatnio edytowany przez debbie (2009-04-29 09:15:03)


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#2  2009-04-29 09:25:53

  kamikaze - Administrator

kamikaze
Administrator
Zarejestrowany: 2004-04-16

Re: PHP - Kwota słownie - dziwny przypadek

A co to za dziwna konstrukcja?

Kod:

for($i=0; $i< $dana; $i = $i+1)
$test = include('slownie.php');
{
    $test;
}

W takim wypadku ci includuje w petli ten sam skrypt i stąd błąd. Skrypt definiuje funkcje, skrypt includujesz wiele razy bez sensu redeklaracja się nie udaje, co jasno opisuje komunikat.

Ostatnio edytowany przez kamikaze (2009-04-29 09:28:36)

Offline

 

#3  2009-04-29 09:40:58

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: PHP - Kwota słownie - dziwny przypadek

No wykona ( wyświetli na ekranie ) mi tyle razy skrypt z kodem w slownie.php ile wpisze do formularza:

$dana = $_GET['numer']; - pobiera z formularza


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#4  2009-04-29 09:57:06

  kamikaze - Administrator

kamikaze
Administrator
Zarejestrowany: 2004-04-16

Re: PHP - Kwota słownie - dziwny przypadek

To niech tam się wykonuje kod, który coś wykonuje, bez deklaracji funkcji, bo się próbują za każdym razem deklarować i jest błąd. Proponowałbym zaincludować jedynie funkcje raz i w tej pętli for napisać normalnie kod który coś z nimi robi.

Offline

 

#5  2009-04-29 11:50:55

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: PHP - Kwota słownie - dziwny przypadek

Troche rozumie i troche nie - mozesz na podstawie w/w skryptow sprobowac pokazac mi przyklad???


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

#6  2009-04-29 14:25:13

  kamikaze - Administrator

kamikaze
Administrator
Zarejestrowany: 2004-04-16

Re: PHP - Kwota słownie - dziwny przypadek

Powiem tak, includowanie nie jest do wykonywania jakichkolwiek skryptów. Ok, przykład, ale nie bede przeklejał twoich rzeczy.


Masz u siebie skrypt.php:

Kod:

funkcja1()
{
//coś robi
}

funkcja2()
{
// coś robi
}

// potem używamy funkcji
funkcja1();
funkcja2();

i taki coś sobie bez sensu includujesz dostając błąd że funkcja1() jest już zdefiniowana. To już na drugim includowaniu tego pliku się wywala. Bo funkcji się nie includuje wiele razy. Więc robisz to raz i wywalasz ze skrypt.php cały kod inny niż funkcje:

Kod:

include('skrypt.php');

for($i=0; $i< $dana; $i = $i+1)
{
    funkcja1();
    funkcja2();
}

Właściwie to chyba wiem czemu nie rozumiesz. Funkcja inklude nie działa tak jak chyba myslisz. Include() nic nie zwraca, powoduje włączenie kodu skryptu w miejscu jej wywołania i tyle. Poczytaj http://pl.php.net/manual/pl/function.include.php. Dlatego bez sensu jest podstawianie jej pod zmienną $test i potem jakieś coś takiego w nawiasach klamrowych z niewiadomego powodu:

Kod:

{
    $test;
}

Jakoś nawymyślałeś na czuja chyba.

Offline

 

#7  2009-04-30 08:08:01

  debbie - Użytkownik

debbie
Użytkownik
Zarejestrowany: 2006-09-19

Re: PHP - Kwota słownie - dziwny przypadek

Rzeczywiście! Niepotrzebnie includowałem skrypt z kwotą słownie! :) Także poszło:) Dzięki na naprowadzenie:)


debbie
Wrócę jak zjem zupę i drugie danie - tyle
a oto ta zupa:

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)