Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Dodawanie przedrostków wielkości
robi783
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.06.2007

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


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





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 29.08.2003
Skąd: Warszawa

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


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

Ten post edytował Krzasz 15.09.2007, 16:26:27


--------------------
Pozdrawiam,

InSee Sp. z o.o. - Solutions delivered
Go to the top of the page
+Quote Post
robi783
post
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.06.2007

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


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





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 29.08.2003
Skąd: Warszawa

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


$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.

Ten post edytował Krzasz 15.09.2007, 22:55:52


--------------------
Pozdrawiam,

InSee Sp. z o.o. - Solutions delivered
Go to the top of the page
+Quote Post
robi783
post
Post #5





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.06.2007

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


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
Go to the top of the page
+Quote Post
Krzasz
post
Post #6





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 29.08.2003
Skąd: Warszawa

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


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. ?>


--------------------
Pozdrawiam,

InSee Sp. z o.o. - Solutions delivered
Go to the top of the page
+Quote Post
robi783
post
Post #7





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.06.2007

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


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
Go to the top of the page
+Quote Post
Krzasz
post
Post #8





Grupa: Zarejestrowani
Postów: 56
Pomógł: 0
Dołączył: 29.08.2003
Skąd: Warszawa

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


  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


--------------------
Pozdrawiam,

InSee Sp. z o.o. - Solutions delivered
Go to the top of the page
+Quote Post
robi783
post
Post #9





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.06.2007

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


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.

Ten post edytował robi783 16.09.2007, 21:53:19
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 03:46