uprava Nette\Templates\TemplateHelpers::bytes()

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Lopo
Člen | 277
+
0
-

kedze som riesil nejake veci ohladom skracovania velkosti v bytoch, narazil som na problem 1k pocitaneho ako 1000 vs 1024 a s tym suvisiace prefixy jednotiek ‚k‘ vs ‚Ki‘

vznikla z toho nasledovna uprava helpera bytes() ktoru davam k dispozicii a myslim ze by nebolo odveci aby sa dostala do Nette

/**
 * Converts to human readable file size.
 * @param int value
 * @param int number of decimal digits
 * @param int value of 1k
 * @param bool use ISO/IEC unit names
 * @see http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=31898
 * @return string formated value
 */
public static function bytes($bytes, $precision=2, $k=1024, $iec=FALSE)
{
	$bytes=round($bytes);
	if ($iec && $k==1024) // only if ISO/IEC forced
		$units=array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB');
	elseif ($k==1000 || $k==1024) // 1024 breaks ISO/IEC
		$units=array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
	else // invalid $k value
		return $bytes;
	foreach ($units as $unit) {
		if (abs($bytes)<$k || $unit===end($units))
			break;
		$bytes=$bytes/$k;
		}
	return round($bytes, $precision)." $unit";
}

rozsirenie je riesene pomocou dalsich 2 parametrov metody:

  • 3ti urcuje aka je velkost 1k
  • 4ty urcuje ci sa maju pouzit IEC nazvy jednotiek

defaultne ostava funkcnost ako povodna verzia (aj ked je to proti ISO/IEC norme, ale asi vacsine ‚geekov‘ prirodzenejsie), pre dosiahnutie IEC nazvov je potrebne aby 1k nebolo 1000 a povolilo sa pouzitie IEC

pre presne chovanie podla ISO/IEC treba upravit podmienky na if($k=1024)elseif($k=1000)else

v pripade zadania 1k ineho nez 1000 a 1024 vrati len povodnu hodnotu

k tomu vsetkemu som doplnil dalsie 3 velkosti: Exa, Zetta, Yotta ktore su v norme obsiahnute a mali by na chvilu asi vystacit :)

jasir
Člen | 746
+
0
-

Zkus poslat pull request na github

David Grudl
Nette Core | 8147
+
0
-

Myslím, že není potřeba bytes() komplikovat dalšími parametry. Pokud budu chtít jednotky uvádět dle ISO/IEC, tak si helper bytes nastavím na vlastní funkci.

Lopo
Člen | 277
+
0
-

nemyslim ze je to komplikovanie …

tie dalsie 2 parametre nejsu povinne, v pripade prepisu halpera budu aj nadalej vsade rovnake vysledky, len to umozni v pripade potreby dodatocne veci

nerad prepisujem v app veci ktore su priamo v Nette, ale v tomto pripade nemam moc na vyber kedze ten helper v Nette nedodrzuje a ani neumoznuje dodrzovat normu – preto som prave vytvoril tuto verziu ktora to umoznuje vynutit ale v zaklade aj nadalej umoznuje aktualne pouzivanie

David Grudl
Nette Core | 8147
+
0
-

Tohle téma se tu řešilo už vícekrát, takže ve stručnosti: potřeba uvádět jednotky dle ISO/IEC normy je minoritní, uživatelům je to fuk, nakonec Průzkumník ve Windows taky uvádí jednotky nenormativně. Třída Template je navržena právě tak jak je, aby se funkčnost dala měnit, je to tedy čisté.

Jsem rád, že jsi tu uvedl kód vylepšené funkce, ale spíš bych jej přesunul do tipů a triků.