Portál AbcLinuxu, 12. května 2025 07:05

Dotaz: php prevod cisel

petka avatar 6.5.2010 14:40 petka | skóre: 25 | blog: heydax | Klasterec N/O
php prevod cisel
Přečteno: 1276×
Odpovědět | Admin
Mam tabulku , kterou taham z mysql a ve sloupic data_in a data_out jsou ulozena cisla v bytech a potreboval bych to doplnit o funkci prevodu cisla na B , kB , MB , GB . priklad 122.22 MB data jsou ulozena v bytech .
Ubuntu server - Asus E35M1​-M ​- AMD Hudson M1 , 2x Technisat Skystar2 , 2x 1GB Lan , WiFi mod AP ,vdr,mysql,apache2...

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

poky74 avatar 6.5.2010 15:15 poky74 | skóre: 36 | blog: Zápisník | Vrchlabí
Rozbalit Rozbalit vše Re: php prevod cisel
Odpovědět | | Sbalit | Link | Blokovat | Admin

Podmínkou zjistit jestli je číslo (počet bytů) větší než počet bytů o jeden řád větší, potom dosaď jednotky.

Chcete Linuxové samolepky nebo Tuxe na klíče? ->
petka avatar 6.5.2010 16:22 petka | skóre: 25 | blog: heydax | Klasterec N/O
Rozbalit Rozbalit vše Re: php prevod cisel
a muzu poprosit o pribliznou syntaxi
Ubuntu server - Asus E35M1​-M ​- AMD Hudson M1 , 2x Technisat Skystar2 , 2x 1GB Lan , WiFi mod AP ,vdr,mysql,apache2...
Řešení 1× (petka (tazatel))
poky74 avatar 6.5.2010 16:52 poky74 | skóre: 36 | blog: Zápisník | Vrchlabí
Rozbalit Rozbalit vše Re: php prevod cisel

function hatatitla($byte){

if($byte<1000){$kolik=$byte;$jednotka="B";}

elseif($byte>=1000){$kolik=$byte/1000;$jednotka="kB";}

elseif($byte>=1000000){$kolik=$byte/1000000;$jednotka="MB";}

//atd atd

return "".$kolik." ".$jednotka.""; }

echo hatatitla(1000); //vrati 1kB

Chcete Linuxové samolepky nebo Tuxe na klíče? ->
Řešení 1× (petka (tazatel))
6.5.2010 16:56 Vaclav Bohac | skóre: 3 | Kopřivnice, Vlčovice
Rozbalit Rozbalit vše Re: php prevod cisel
Tohle mi přišlo jako docela pěkné řešení:

function fsize_unit_convert($bytes)
{
    $units = array('b', 'kb', 'mb', 'gb');
    $converted = $bytes . ' ' . $units[0];
    for ($i = 0; $i < count($units); $i++) {
         if (($bytes/pow(1024, $i)) >= 1) {
              $converted = round($bytes/pow(1024, $i), 2) . ' ' . $units[$i];}
         }
         return $converted;
    }
}
"A computer is like air conditioning: it becomes useless when you open windows." - Linus Torvalds
petka avatar 6.5.2010 17:22 petka | skóre: 25 | blog: heydax | Klasterec N/O
Rozbalit Rozbalit vše Re: php prevod cisel
Dekuji moc vsem .
Ubuntu server - Asus E35M1​-M ​- AMD Hudson M1 , 2x Technisat Skystar2 , 2x 1GB Lan , WiFi mod AP ,vdr,mysql,apache2...
7.5.2010 10:12 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: php prevod cisel
Jen připomínka je tam 1024 a jednotky kb, mb, gb, a to jsou dvě nesrovnalosti v jednom
  • Mělo by tam být 1000 nebo „binary“ jednotky KiB,MiB,GiB
  • Zapisujeme kB, MB, GB a KiB, MiB, GiB, malé 'b' jsou spíše bity (i když jej zapisujeme spíše jako bit tedy bit kbit, Mbit, Gbit a v binary (1024) Kibit, Mibit Gibit) než bajty
To, že je to ve starších věcech nedobře(dle dnešních pravidel), by nemělo vést k tomu, aby jsme to dále nedobře používali. :)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
Josef Kufner avatar 9.5.2010 23:49 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: php prevod cisel
Nebylo by lepší použít místo toho foru logaritmus?
$i = (int) log($bytes, 2) / 10;
Hello world ! Segmentation fault (core dumped)
10.5.2010 13:13 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: php prevod cisel
Příloha:
Nedalo mi to, bo obecně nemám rád „matematická“ řešení, azkusil jsme si to.
Odpověď zní: „výkonnostně určitě bylo“ – je to více než 3× rychlejší.
Ale pokud se to zpracuje jinak, tak už »nebylo« :).
Výsledek při stejném počtu cyklů:
HMST:  5.052839040756 sec (HumanReadableSizeTest)
 HMS:  6.325034141540 sec (HumanReadableSize)
 FSC: 23.292122125626 sec (fsize_unit_convert)
FSCL:  7.134121179580 sec (fsize_unit_convert_log)
Zdrojový kód v příloze spuštěný z řádku php -f test.php. :)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
Josef Kufner avatar 10.5.2010 14:32 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: php prevod cisel
To volání pow() není fér...
function fsize_unit_convert_log_optimized($bytes)
{
	static $units = array(
		array(  ' B', 1),
		array(' KiB', 1024.),
		array(' MiB', 1048576.),
		array(' GiB', 1073741824.),
		array(' TiB', 1099511627776.),
	);
	$u = & $units[(int) log($bytes, 2) / 10];
	return round($bytes / $u[1], 2).$u[0];
}
Test finished
 HMST: 4.99683594704 sec (HumanReadableSizeTest)
  HMS: 5.82857894897 sec (HumanReadableSize)
  FSC: 21.1713778973 sec (fsize_unit_convert)
 FSCL: 6.77399015427 sec (fsize_unit_convert_log)
FSCL2: 4.63680100441 sec (fsize_unit_convert_log_optimized)
:-P
Hello world ! Segmentation fault (core dumped)
10.5.2010 15:52 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: php prevod cisel
Sorry, nikdo neříkal, že ho mám dát pryč :) a lépe to podpořilo mé tvrzení :):):)
Teď bych snad to mohl zmanipulovat jen tak, že bych vypustil Vaše „static“ abych to dorovnal :):):).
PS: „Mezery“ jsem si všiml :)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
6.5.2010 17:31 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: php prevod cisel
Už jsem to napsal tak to pošlu :) - je to jen rozepsané a efektivnější než pow :).
<?php

$def_blockSize_1000 = Array(Array(1.0,'B'),
                            Array(1000.0,'kB'),
                            Array(1000000.0,'MB'),
                            Array(1000000000.0,'GB'),
                            Array(1000000000000.0,'TB'));
$def_blockSize_1024 = Array(Array(1.0,'B'),
                            Array(1024.0,'KiB'),
                            Array(1024.0*1024.0,'MiB'),
                            Array(1024.0*1024.0*1024.0,'GiB'),
                            Array(1024.0*1024.0*1024.0*1024.0,'TiB'));

function HumanReadableSize($value, $ain,$decimal=2,$dec_points='.',$thousands_sep='')
{ 
  if($value < 0)
    return "?";
  for($i = count($ain)-1;$i > 0;$i--)
  {
    if($value > $ain[$i][0])
      return number_format((float)$value / $ain[$i][0],$decimal,$dec_points,$thousands_sep) . $ain[$i][1];
  }
  return $value .  $ain[0][1];
}

echo "SI <br />\n";
echo "900B = " . HumanReadableSize(900,$def_blockSize_1000) ." <br />\n";
echo "1101B =" . HumanReadableSize(1101,$def_blockSize_1000) ." <br />\n";
echo "1200123B = " . HumanReadableSize(1200123,$def_blockSize_1000) ." <br />\n";
echo "1307895456B = " . HumanReadableSize(1307895456,$def_blockSize_1000) ." <br />\n";
echo "1571597537412B ≈ " . HumanReadableSize(1571597537412,$def_blockSize_1000) ." <br />\n";
echo "Binary <br />\n";
echo "900B = " . HumanReadableSize(900,$def_blockSize_1024) ." <br />\n";
echo "1101B = " . HumanReadableSize(1101,$def_blockSize_1024) ." <br />\n";
echo "1200123B = " . HumanReadableSize(1200123,$def_blockSize_1024) ." <br />\n";
echo "1307895456B = " . HumanReadableSize(1307895456,$def_blockSize_1024) ." <br />\n";
echo "1571597537412B ≈ " . HumanReadableSize(1571597537412,$def_blockSize_1024) ." <br />\n";

return;
?>
PS: pokud pracujete s velkými čísly (v terách a v 64bit Integer-u) udělejte to už na straně SQL.
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.