Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Dodawanie przedrostków wielkości
Forum PHP.pl > Forum > PHP
robi783
Witam wszystkich.
Chciałbym zapytać czy zna ktoś jakieś proste zrozwiązanie na wyświetlanie liczb zamiast w postaci np. 4e+9 Hz w postaci bardziej czytelnej 4Ghz. Dane pobierane są z bazy MySQL przez zapytania PHP i wyświetlane na stronie html.
Krzasz
spróbuj tym number_format" title="Zobacz w manualu PHP" target="_manual

EDIT: dopiero teraz skumałem post po przeczytaniu tematu

no jak to jak, dzielisz przez e9 i masz w GHz, e6 w MHz, itd
robi783
Masz rację, lecz może sprecyzuję trochę zagadnienie.
Jest sobie baza przyrządów i w jakiejś tabeli przechowuje dane zakresów pomiarowych przyrządów.
Zakres jest określony jako wartość minimalna i maksymalna i waha się od rzędu nano do giga - i jest różna dla różnych przyrządów.
Obsługa całej bazy odbywa się przez stronę www. Jedną z funkcji jest prezentacja porównania parametrów przyrządów.
I teraz jeszcze raz pytanie w jaki sposób łatwo zmienić sposób prezentacji liczb żeby zamiast np. 100000 lub 2e+9 uzyskać 1M czy 1G pamiętając, że liczba w danej komórce tabeli może być różnej wielkości.
Krzasz
$a w kodzie oznacza liczbę pobieraną z bazy, do której ma być przedrostek

  1. <?php
  2.  
  3. $a = 20000000;
  4. $jednostka = 'Hz';
  5.  
  6. $przedrostki = array();
  7. $przedrostki[18] = 'E';
  8. $przedrostki[15] = 'P';
  9. $przedrostki[12] = 'T';
  10. $przedrostki[9] = 'G';
  11. $przedrostki[6] = 'M';
  12. $przedrostki[3] = 'k';
  13. $przedrostki[2] = 'h';
  14. $przedrostki[1] = 'da';
  15. $przedrostki[0] = '';
  16. $przedrostki[-1] = 'd';
  17. $przedrostki[-2] = 'c';
  18. $przedrostki[-3] = 'm';
  19. $przedrostki[-6] = 'ľ';
  20. $przedrostki[-9] = 'n';
  21. $przedrostki[-12] = 'p';
  22. $przedrostki[-15] = 'f';
  23. $przedrostki[-18] = 'a';
  24.  
  25. $log = (int)round(log10(abs($a)));
  26. $b = round($a/pow(10, $log));
  27.  
  28. while (!array_key_exists($log, $przedrostki) || abs($log) > 18) {
  29.  if ($log < 0) {
  30.  $log++;
  31.  $b = round($b/10);
  32. } else {
  33.  $log--;
  34.  $b = round($b*10);
  35. }
  36. }
  37.  
  38. if ($log < -18) {
  39.  $b = round($b*pow(10, 18));
  40.  $log = -18;
  41. }
  42.  
  43. if ($log > 18) {
  44.  $b = round($b/pow(10, 18));
  45.  $log = 18;
  46. }
  47.  
  48. echo $b.' '.$przedrostki[$log].$jednostka;
  49.  
  50. ?>


Sprawdź powinno być ok.
robi783
Wielkie dzięki to jest prawie to o co mi chodzi.
Tylko, że jest gdzieś błąd w funkcji ponieważ np dla 1e-5 wyświetla 0 mHz, podobnie dla 10m.
Po zapętleniu funkcji od 1e-9 do 1e+9 otrzymałem następujące wyniki:
CODE
X-Powered-By: PHP/5.2.0
Content-type: text/html

0ľHz 0ľHz 1ľHz 0mHz 0mHz 1mHz 0Hz 0Hz 1Hz 10Hz 100Hz
1kHz 10kHz 100kHz 1MHz 10MHz 100MHz 1GHz 10GHz
Krzasz
spróbuj usunąć round przy $b i zamień:

  1. <?php
  2. while (!array_key_exists($log, $przedrostki) || abs($log) > 18) {
  3. ?>


na

  1. <?php
  2. while (!array_key_exists($log, $przedrostki) && abs($log) < 19) {
  3. ?>
robi783
Niestety, teraz wyniki są takie:
CODE
X-Powered-By: PHP/5.2.0
Content-type: text/html

11nHz 10ľHz 10ľHz 11ľHz 10mHz 10mHz 11mHz 10Hz 10Hz 11Hz
110Hz 1100Hz 11kHz 110kHz 1100kHz 11MHz 110MHz 1100MHz
Krzasz
  1. <?php
  2. $a = 2000;
  3. $jednostka = 'Hz';
  4.  
  5. $przedrostki = array();
  6. $przedrostki[18] = 'E';
  7. $przedrostki[15] = 'P';
  8. $przedrostki[12] = 'T';
  9. $przedrostki[9] = 'G';
  10. $przedrostki[6] = 'M';
  11. $przedrostki[3] = 'k';
  12. $przedrostki[2] = 'h';
  13. $przedrostki[1] = 'da';
  14. $przedrostki[0] = '';
  15. $przedrostki[-1] = 'd';
  16. $przedrostki[-2] = 'c';
  17. $przedrostki[-3] = 'm';
  18. $przedrostki[-6] = 'ľ';
  19. $przedrostki[-9] = 'n';
  20. $przedrostki[-12] = 'p';
  21. $przedrostki[-15] = 'f';
  22. $przedrostki[-18] = 'a';
  23.  
  24. $log = (int)round(log10(abs($a)));
  25. $b = round($a/pow(10, $log));
  26.  
  27. while (!array_key_exists($log, $przedrostki) && abs($log) < 19) {
  28.  $log--;
  29.  $b = round($b*10);
  30. }
  31.  
  32. if ($log < -18) {
  33.  $b = round($b*pow(10, 18));
  34.  $log = -18;
  35. }
  36.  
  37. if ($log > 18) {
  38.  $b = round($b/pow(10, 18));
  39.  $log = 18;
  40. }
  41.  
  42. echo $b.' '.$przedrostki[$log].$jednostka.'<br />';?>


to działa na pewno smile.gif
robi783
Dzękuję, działa tak jak powinno.
Zmieniłem tylko:

CODE

<?php
$b = round($a/pow(10, $log));
?>


na

CODE

<?php
$b = round($a/pow(10, $log),2);
?>


ponieważ często występowały w tabeli zapisy typu np. 1.6e do cos tam i były zaokrąglane.
Pozdrawiam.
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.