Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Kropkę na przecinek w obliczeniach,
Forum PHP.pl > Forum > Przedszkole
marian2299
Co muszę zrobić, żeby w obliczeniach np takim :
  1. <?php
  2.  
  3. $dzialanie = 100/15;
  4. $wynik = $dzialanie/4;
  5.  
  6. echo "$wynik";
  7.  
  8. ?>


Wynik był 1,66... zamiast : 1.66666666667 ?

Z góry dzięki.
slawo123
http://pl.php.net/number_format

echo number_format($wynik, 2, ',', ' ')
marian2299
Nie oto mi chodziło.
Teraz pokazuje "1,67" a miało być "1,66...".
erix
round" title="Zobacz w manualu PHP" target="_manual dry.gif

Nie było w podobnych?
marian2299
Jakich "podobnych" ? Poza tym, ja NIE chce zaokrąglać!!
Suh
  1. <?php
  2. str_replace('.', ',', substr($wynik, 0, 4));
  3. ?>


np. coś takiego, z tym, że argument o wartości 4 w substr to ilość znaków przy założeniu że przed przecinkiem jest tylko jedna cyfra..
modyfikację zostawiam Tobie.. może się przydać funkcja strpos" title="Zobacz w manualu PHP" target="_manual
erix
A jak będzie miał liczbę z większą liczbą całości, wtedy Twój kod będzie bezużyteczny.

printf" title="Zobacz w manualu PHP" target="_manual/sprintf" title="Zobacz w manualu PHP" target="_manual z odpowiednim wzorcem, ew. potem kropkę zamienić.
Suh
Wiem, wspomniałem o tym i dlatego też podałem funkcję strpos na końcu.
Poza tym powiedzmy wywołanie sprintf("%.2f", $wynik) zaokrągli wynik do 2 miejsca po przecinku, a nie obetnie. Sam o takim rozwiązaniu pomyślałem i początkowo tak napisałem ale po sprawdzeniu musiałem edytować post.
erix
Zawsze zostaje money_format" title="Zobacz w manualu PHP" target="_manual, ale pod windows nie działa. I nie jestem pewien, czy też nie zaokrągla.

Ew. explode" title="Zobacz w manualu PHP" target="_manual po kropce, obcięcie do dwóch drugiego elementu i potem sklejenie przecinkiem.
marian2299
Dziękuje winksmiley.jpg
Spytam jeszcze tutaj:
Jak zrobić coś w stylu "jeśli liczba jest 2 cyfrowa to.." ?

  1. <?php
  2.  
  3. $dzialanie = 100/15;
  4. $wynik = $dzialanie/4;
  5. $znaki = strlen($wynig);
  6. ?>
  7.  
  8. <?php
  9. if ($znaki == 3)
  10. {
  11. $wynig = str_replace('.', ',', substr($wynik, 0, 4));
  12. echo $wynig;
  13. }
  14. else if($znaki == 4)
  15. {
  16. $wynig = str_replace('.', ',', substr($wynik, 0, 5));
  17. echo $wynig;
  18. } else {}
  19. ?>

Jak tam :
$wynig = str_replace('.', ',', substr($wynik, 0, 5));
odwołać się do globalnej ? pisałem :
$wynig = str_replace('.', ',', substr(global $wynik, 0, 5));
ale nie działało.
Suh
Nie działało, ponieważ jeżeli takiego kodu użyłeś jak na powyższym listingu to jest w nim dość istotny błąd.

Zmienna $znaki dostaje wartość 0, bo zmienna $wynig nie jest jeszcze zainicjalizowana. Dlatego też w poniższych warunkach wchodzisz do else {} gdzie nie ma nic..

Wcześniej podałem aby użyć funkcji strpos, która uelastyczniła by cały ten skrypt. Np. w ten sposób :

  1. <?php
  2. $dzialanie = 100/15;
  3. $wynik = $dzialanie/4;
  4.  
  5. $po_przecinku = 2; // ilosc cyfr po przecinku
  6.  
  7. if(strpos($wynik, '.') === true)    // sprawdzenie czy w wyniku jest kropka
  8.    $znaki = strpos($wynik, '.') + 1 + $po_przecinku;    // w wyrazeniu jest +1 poniewaz pozycja jest podawana od 0, a nie od 1
  9. else         // jezeli nie ma kropki to jest przepisywane cale wyrazenie
  10.    $znaki = strlen($wynik);
  11.    
  12. $wynig = str_replace('.', ',', substr($wynik, 0, $znaki));
  13. echo $wynig;
  14. ?>
marian2299
Hah, ale czemu i tak pokazuje mi :
1,66666666667 ?
Suh
Przyznam szczerze. Nie testowałem tego skryptu tylko pisałem z głowy w oparciu o manual.

Poniżej masz wersje działającą.

  1. <?php
  2. $dzialanie = 100;
  3. $wynik = $dzialanie/4;
  4.  
  5. $po_przecinku = 2;
  6. $pozycja = strpos($wynik, '.');
  7.  
  8. if ($pozycja !== false)
  9.    $znaki = $pozycja + 1 + $po_przecinku;
  10. else
  11.    $znaki = strlen($wynik);
  12.  
  13.  
  14. $wynig = str_replace('.', ',', substr($wynik, 0, $znaki));
  15. echo $wynig;
  16. ?>


To juz testowałem i powinno działać smile.gif
marian2299
No nie mogę, pokazało mi się "25" laugh.gif.
Pr0100
  1. <?php
  2. $dzialanie = 100/15;
  3. $wynik = $dzialanie/4;
  4.  
  5. echo number_format($wynik, strlen($wynik), ',', '');
  6.  
  7. ?>


wynik: 1,6666666666667
marian2299
No i co z tego, Pr0100?
Pr0100
teraz?
Suh
marian przyjrzyj się UWAŻNIE początkowi tego co napisałem i będziesz wiedział czemu jest 25. Nie ma dzielenia przez 15..
marian2299
Mógłbyś przeczytać temat ;].
Ma się pokazywać "1,66"
Pr0100
  1. <?php
  2. $dzialanie = 100/15;
  3. $wynik = $dzialanie/4;
  4.  
  5. echo substr(number_format($wynik, 3, ',', ''), 0, -1);
  6.  
  7. ?>


wynik: 1,66
marian2299
Y. A czemu tam jest -1 ?
Wicepsik
Cytat(marian2299 @ 4.07.2009, 14:34:45 ) *
Y. A czemu tam jest -1 ?

Przeczytaj manual
substr" title="Zobacz w manualu PHP" target="_manual

//Nie podawajcie gotowca
marian2299
Jeszcze raz wyjaśnię.
Jeśli zmienię liczby w $działanie i $wynik, to działanie też powinno działać dobrze. A tutaj każecie odejmować 1 ? Przecież przy innych liczbach to może nie mieć sensu ;/.
Wicepsik
Mówiłem, przeczytaj manual. Nie odejmuje się -1 wstydnis.gif
marian2299
Cytat(Suh @ 4.07.2009, 14:19:09 ) *
marian przyjrzyj się UWAŻNIE początkowi tego co napisałem i będziesz wiedział czemu jest 25. Nie ma dzielenia przez 15..

Och, żal mi się. Ślepota nie boli. Dzięki, pomogłeś mi najbardziej.
Pr0100
Cytat
Y. A czemu tam jest -1 ?


-1 w kodzie daje +5 do lansu i +3 do bezpieczeństwa
nexis
Cytat(marian2299 @ 3.07.2009, 19:55:32 ) *
Co muszę zrobić, żeby w obliczeniach (...) Wynik był 1,66... zamiast : 1.66666666667


  1. <?php
  2. setlocale(LC_ALL, 'pl_PL');
  3.  
  4. $dzialanie = 100/15;
  5. $wynik = $dzialanie/4;
  6.  
  7. echo $wynik;
  8. ?>
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-2025 Invision Power Services, Inc.