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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
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)
Offline
A co to za dziwna konstrukcja?
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
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
Offline
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
Troche rozumie i troche nie - mozesz na podstawie w/w skryptow sprobowac pokazac mi przyklad???
Offline
Powiem tak, includowanie nie jest do wykonywania jakichkolwiek skryptów. Ok, przykład, ale nie bede przeklejał twoich rzeczy.
Masz u siebie skrypt.php:
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:
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:
{ $test; }
Jakoś nawymyślałeś na czuja chyba.
Offline
Rzeczywiście! Niepotrzebnie includowałem skrypt z kwotą słownie! :) Także poszło:) Dzięki na naprowadzenie:)
Offline
Strony: 1