Autor Zpráva
ServIT
Profil
Zdravíčko,
Na mnoha místech používám převod čísla na lidsky ( teda spíše technicky ) čitelný zápis. Donedávna jsem asi 5 let používal funkci, která, jak se ukázalo nedávno převádí špatně. Už nevím, kde jsem ji okopčil, hledat tento druh převodu v angličtině .. no asi jsem hledal ne zrovna správně, ( výsledky hledání byly úplně mimo mé představy ) ale jeden výsledek se trefil - vyskočil na mně kód podobný tomu, co jsem kdysi okopčil. Ale tento kód neměl možnost zvolit IT jednotky, takže to byl pro mně krok zpět ( Format bytes to kilobytes, megabytes, gigabytes - jedna z odpovědí Leo)

Teda, abych to shrnul, mám číslo 4000051, chci 4MB.

Protože ten nalezený kód byl pro mně nevhodný ( nefungoval podle mých představ), holt jsem zapnul mozek, a trochu to přepsal:
 function hrv2( $value, $unit, $IT=FALSE, $precision=2 ){
    $sign = $value < 0 ? '-':'';
    $value = abs( $value );
    $pownames = array('-4'=>'p', '-3'=>'n', '-2'=>'µ', '-1'=>'m', '0'=>'', '1'=>'k', '2'=>'M', '3'=>'G', '4'=>'T');

    $exp    =    $IT ? 1024 : 1000;
    $ITSign  = $IT ? 'i':'';
    $value = max($value, 0);
    $pow = floor(($value ? log($value) : 0) / log($exp));
    $pow = min($pow, count($pownames) - 1);
    $value /= pow($exp, $pow);
    return $sign.round($value, $precision) . " " . $pownames[$pow].$ITSign.$unit;
}

V tomto řešení vše funguje, nicméně, ještě není dořešena kontrola na existenci přípony, pokud je číslo velmi malé - velké.

Takže kód dávám k dispozici, doufám, že nevynalézám kolo :D a pokud dořeším ( nebo navrhnete vhodný postup) to omezení, tak to tady uvedu...

Milan
anonym_
Profil *
ServIT:
Fungujících příkladů se dá najít hafo. A kratších. Např. www.php.net/manual/en/function.filesize.php#106569
ServIT
Profil
anonym:
hm.. a umí IT jednotky... ? a umí mg ? pF ( piko Farady ) ?
A o tom jsem psal ...

Ale vlastně ... ještě jeden zádrhell tu je : tuny ... hm ... doladíme

to pořešení neexistující přípony ( abychom se vyhnuli chybové hlášce :
namísto
$pow = min($pow, count($pownames) - 1);
dát
     if( ! array_key_exists( $pow, $pownames )){
        $powchange = $pow > 0 ? -1 : 1 ;
        do{
            $pow += $powchange;
        } while( ! array_key_exists( $pow, $pownames ));

    }
N71
Profil *
Proč se snažíš bastlit něco co už někdo zkušenější určitě vytvořil? Vlez na github.com a najdi si knihovnu pro převod jednotek tam.
Kcko
Profil
ServIT:
V době AI (GPT, Claude, Gemini) máš potřebu si tohle psát sám?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0