Autor Zpráva
MyShare
Profil
Zdravím,
Mám taký menší problém s týmto kódom
static public function formatSize( $size=0 )
    {
        $units    = array( 'B', 'KB', 'MB', 'GB', 'TB' );
        
        $size    = max( $size, 0 );
        $pow    = floor( ( $size ? log( $size ) : 0 ) / log(1024) ); 
        $pow    = min( $pow, count($units) - 1 ); 
        $size    /= pow( 1024, $pow ); 

        return round( $size, 2 ) . ' ' . $units[ $pow ]; 
    }
ak zadám napr. 524288000 kB (500 GB) vyhodí mi iba údaj 500 MB a pri viac KB čiže napr. 1TB mi vyhodí automatický len max 4194304 kB (4 GB)
Ďakujem za pomoc
tiso
Profil
MyShare: tá funkcia berie ako vstup iba číslo - počet bytov. Jednotky, ktoré tam chceš vložiť, sa ignorujú.
MyShare
Profil
tiso:
Vďaka za odpoveď čo by si mi ty odporúčal?
tiso
Profil
MyShare: odporúčam ti popísať čo chceš dosiahnuť. Chceš prepísať tú funkciu, aby brala do úvahy i jednotky? Alebo čo?
MyShare
Profil
tiso:
Samozrejme ide mi o to aby keď zadám 10737418240 kB (10 TB) aby mi to vyhodilo 10 TB a nie aby mi to prepísalo len do 4194304 kB (4 GB)
alebo
ak zadám napr. 524288000 kB (500 GB) aby mi to nevyhodilo iba údaj 500 MB
peta
Profil
str = "10737418240 kB"; // (10 TB)
units = "kMGT";
n = str.replace(/[/D]/g,''); //smaze vse, co neni cislo
u = str.replace(/[\d\sB]/g,''); //smaze vse, co je cislo, mezera nebo B
k = units.indexOf(k); // vyhleda pozici retezce k v retezci str
n = n * (10 ^ (k+1));
alert(n);
A kdyz ted vypocitas nove k a u, tak to muzes zpetne prevest 
k = ...
u = ...
u = units.substring(k,1); // vyhleda pozici retezce k v retezci str
return k + " " + u;
MyShare
Profil
peta:
Vďaka za pomoc ale tvoj kód mi vyhadzuje samé chyby
Davex
Profil
MyShare:
Vďaka za pomoc ale tvoj kód mi vyhadzuje samé chyby
On si jenom nevšiml, že používáš jiný programovací jazyk. Do večera mu dávám čas na opravu a pokud to nestihne, tak bude smazán.
MyShare
Profil
Davex:
Aj sa mi to zdalo, že niečo na tom je čudne
napr.
str.replace namiesto str_replace n namiesto $n atď ja nie som žiaden Guru v programovaní no len sa učím ale to by si asi každý všimol, že to nie je .php jazyk ale nevadí takže stále čakám na nejaké nakopnutie :)
peta
Profil
Davex:
"Do večera mu dávám čas"
Si myslis, ze ctu forum 24hodin denne? :)
Spis zajimava otazka, jak to, ze to MyShare nepoznal? :) Preci, kdo dela php uz urcite ovlada i javascript, tak neni problem to prepsat do php, ne? :)

$str = "10737418240 kB"; // (10 TB)
$units = "kMGT";
$n = preg_replace('/[/D]/','',$str); //smaze vse, co neni cislo
$u = preg_replace('/[\d\sB]/','',$str); //smaze vse, co je cislo, mezera nebo B
$k = strpos($k,$units); // vyhleda pozici retezce k v retezci str
$n = $n * (10 ^ ($k+1));
echo $n;
tiso
Profil
peta: spoznať si to mal ty: on tu dal funkciu v PHP, ty si mu napísal inú v Javascripte. Prečo?
MyShare
Profil
peta:
Stále to nie je funkčné
snažil som sa dosadiť $pow , $size ale nič s toho nezaberá ukazujeme ti len 0 a k tomu mi ešte hádže chybu
Warning: preg_replace() [function.preg-replace]: Unknown modifier ']' in

Ale aj tak ďakujem za ochotu !!!
peta
Profil
'~[\D]~'
'~[\d\sB]~'
Jsem myslel, ze si to uz doladis sam, ne? Na php.net mas manual a priklady. Nebudu vymyslet princit a jeste kazdy kod ladit do dokonalosti. Principialne bys mel pochopit, co to dela a pak uz si sam poradis.
pcmanik
Profil
peta:
Tak načo mu tu dávaš kód, ktorý si má aj tak doladiť nakoniec sám, a ktorý ani nieje funkčný?
1Pupik1989
Profil
Tak jsem to zkusil také. Moc se mi to nelíbí, nicméně to funguje. Nevěděl jsem, jestli to má obsahovat i jednotky nebo ne.

<?php
function formatSize($size = "0 kB"){
  $units = Array("B","kB","MB","GB","TB");
  
  preg_match("~(\d+)~",$size,$attr);

  $length = strlen($attr[1]);
  $size = floatval($attr[1]);

  $pow = floor(($length-1)/3);
  
  return $size/pow(1024,$pow)." ".$units[$pow+1];
}; 

echo formatSize("524288000 kB");  //500 GB
?>

Verze bez jednotek:
function formatSize($size = 0){
  $units = Array("B","kB","MB","GB","TB");
  $length = strlen("$size");
  $pow = floor(($length-1)/3);
  
  return $size/pow(1024,$pow)." ".$units[$pow+1];
}; 

echo formatSize(524288000);  //500 GB
MyShare
Profil
1Pupik1989:

function formatSize($size = "0 kB"){   
$units = Array("B","kB","MB","GB","TB");     

 preg_match("~(\d+)~",$size,$attr);     
 
 $length = strlen($attr[1]);   
 $size = floatval($attr[1]);     
 $pow = floor(($length-1)/3);      
 
 return $size/pow(1024,$pow)." ".$units[$pow+1]; }


Tento kód je správny ibaže pri 4TB mi vyhodí vysledné 3.99999999907 TB
a nepustí ma to na viac ako 4 TB teda ak dám na 5 TB automatický sa to prevedie na tých 4 TB
Joker
Profil
MyShare:
Zkoušel jsem tu funkci zkopírovat a ani jeden z těch problémů se neprojevil.

Nicméně $size nemůže být s jednotkami, to nebude fungovat, musí to být jen číslo.
MyShare
Profil
Joker:
Sorry ale ja hlava maková som nepopísal, že sa jedná o jeden script už hotový takže ešte niekde asi bude zadefinovaná zmena veľkosti tak to skúsim pohľadať ale tento som našiel v functions.php a každá zmena vykonaná v tomto súbore sa prejaví aj na stránke ale skúsim to prehľadať ešte podrobnejšie ....
1Pupik1989
Profil
Joker:
No jo, máš pravdu, ta původní funguje úplně normálně.

Už vím, proč to psalo i nepsalo blbost. Vstup je v bytech. Takže ne 524288000 kB ale 536870912000 B. :)

echo formatSize(536870912000); //500 GB

Pokud chcete vstup v kB, pak přepište:

return round( $size, 2 ) . ' ' . $units[ $pow ];

na

return round( $size, 2 ) . ' ' . $units[ $pow+1 ];
MyShare
Profil
1Pupik1989:
Ako sa snažím tak sa snažím ale vždy je výsledok nulový

zadám 4294967296 kB výsledok ? 4294967295 TB
zadám 10737418240 kB výsledok? 4294967295 TB

Neviem čím to je ale robím niekde chybu?
static public function formatSize($size = "0 kB"){   
     $units = Array("B","kB","MB","GB","TB");     
 
     preg_match("~(\d+)~",$size,$attr);     
 
     $length = strlen($attr[1]);   
     $size = floatval($attr[1]);     
     $pow = floor(($length-1)/3);      
 
      return round( $size, 2 ) . ' ' . $units[ $pow+1 ];
      }
1Pupik1989
Profil
Na tu moji funkci zapomeňte, ta původní co jste přikládal, je v pořádku. Vstup má v bajtech jako integer.
MyShare
Profil
1Pupik1989:
Jasne ale prečo ma to nepustí na viac ako 4 TB?
prečo keď zadám 10 TB čiže 10737418240 kB ma automatický vrátiť po uložení na 4 TB čiže 4294967296 kB ?
1Pupik1989
Profil
Ještě zkuste:

<?php
function formatSize($size=0){
  $units = array( 'B', 'KB', 'MB', 'GB', 'TB' );
  
  $size = max( $size, 0 );
  $pow = floor((strlen("$size")-1)/3);
   
  $pow = min( $pow, count($units) - 1 ); 
  $size /= pow( 1024, $pow ); 
 
  return round( $size, 2 ) . ' ' . $units[ $pow ]; 
};
 
//echo formatSize(524288000);  //500 GB
echo formatSize(4398046511104);
?>

Zkuste průběžně koukat, co jaká proměnná obsahuje. Po uložení znamená co?
pcmanik
Profil
MyShare:
Skús sa radšej pozrieť sem.
MyShare
Profil
Při zpracování BB značek došlo k samovolnému sežrání celého příspěvku. Pardon.
Takto po uložení v administrácii ...
Tu je celý script functions.php

Moderátor Davex: Vymazána tuna kódu, která se zdála naprosto zbytečná

<?php
   
/**
 * Functions
 *
 * @author        UploadScript
 * @since        16 July 2009
 * @version        1
 * @package        Core
 * @copyright    UploadScript
 */

/**
 * Text, language abstraction, and other localization functions
 */
class Functions_Text
{
    /**
     * Format a size
     *
     * @access    public
     * @param    int            File size
     * @return    string        Formatted file size
     * @see        http://us2.php.net/manual/en/function.filesize.php#91477
     */
     static public function formatSize($size=0){
  $units = array( 'B', 'KB', 'MB', 'GB', 'TB' );
  
  $size = max( $size, 0 );
  $pow = floor((strlen("$size")-1)/3);
   
  $pow = min( $pow, count($units) - 1 ); 
  $size /= pow( 1024, $pow ); 
 
  return round( $size, 2 ) . ' ' . $units[ $pow+1 ]; 
}
}

/**
 * User functions class
 */
class Functions_User
{
    /**
     * Return max single file upload size
     *
     * @access    public
     * @return    int
     */
    static public function getMaxUploadSize()
    {
        $_serverMax    = 200000000;

        $_post        = @ini_get('post_max_size');
        $_upload    = @ini_get('upload_max_filesize');
        $_check        = ( $_upload > $_post ) ? $_post : $_upload;

        if ( $_check )
        {
            $_serverMax = $_check;

            preg_match( "#^(\d+)(\w+)$#", strtolower($_serverMax), $match );

            if ( $match[2] == 'm' )
            {
                $_serverMax = intval( $_serverMax ) * 1024 * 1024;
            }
            else if ( $match[2] == 'k' )
            {
                $_serverMax = intval( $_serverMax ) * 1024;
            }
            else
            {
                $_serverMax = intval( $_serverMax );
            }
        }
        
        $_userMax    = isset(Registry::$member['max_filesize']) ? ( Registry::$member['max_filesize'] * 1024 ) : ( Registry::$settings['guest_max_size'] * 1024 );

        return $_serverMax > $_userMax ? $_userMax : $_serverMax;
    }
}
pcmanik
Profil
MyShare:
Svoj obrovský kód, ktorý sa sem naviac ani nevošiel si sem zbytočne dával, nikto ho pozerať nebude, radšej sa pozri na odkaz v [#24].
To lepíš všetky kódy, ktoré nájdeš na internete dokopy?
MyShare
Profil
pcmanik:
Ani jedno z toho nepomohlo stále sa to automatický vrátiť na 4 TB i keď zadám 10 TB


Takže sorry za moju hlúposť ale toto čo je v script functions.php
static public function formatSize( $size=0 )
    {
        $units    = array( 'B', 'KB', 'MB', 'GB', 'TB' );
        
        $size    = max( $size, 0 );
        $pow    = floor( ( $size ? log( $size ) : 0 ) / log(1024) ); 
        $pow    = min( $pow, count($units) - 1 ); 
        $size    /= pow( 1024, $pow ); 
 
        return round( $size, 2 ) . ' ' . $units[ $pow ]; 
    }
potrebujem tak nastaviť aby mi to uložievalo aj hodnoti väčšie ako 4 TB snažili ste sa mi všetci pomôcť a moc si toho cením ale nevšímol som si, že v scripte controls.php je ešte toto
    $_displayMaxSpace    = $_maxDiskspace ? Functions_Text::formatSize( $_maxDiskspace ) : "Unlimited";
    $_displayMaxBw        = $_bandwidthWeek ? Functions_Text::formatSize( $_bandwidthWeek ) : "Unlimited";
    $_displayUsedSpace    = Functions_Text::formatSize( $filesize['filesize'] );
    $_displayBwUsed        = Functions_Text::formatSize( $bandwidth['used'] );
    $_displaySpaceP        = $_maxDiskspace ? ( $filesize['filesize'] ? round( ( $filesize['filesize'] / $_maxDiskspace  ) * 100 ) : '0' ) . '%' : '0';
    $_displayBwP        = $_bandwidthWeek ? ( $bandwidth['used'] ? round( ( $bandwidth['used'] / $_bandwidthWeek ) * 100 ) : '0' ) . '%' : '0';
    $_displaySpacePP    = $_displaySpaceP ? '(' . $_displaySpaceP . ')' : '';
    $_displayBwPP        = $_displayBwP ? '(' . $_displayBwP . ')' : '';
peta
Profil
pcmanik: Od lidi predpokladam urcitou inteligenci a schopnost samostatne pracovat, vyhledavat v manualu a kod is sam opravit. Ja ho muzu navest jen k reseni, nejsem placeny za to, aby delal jeho praci. Spousta lidi toho tu zneuziva pro milionove projekty.
<?php
$t = array();
$str   = "10737418240 kB";
$units = "kMGT";
$n = preg_replace('~[\D]~'   ,'', $str);
$u = preg_replace('~[\d\sB]~','', $str);
$t[] = "cislo-jednotka: " . $n ."-" . $u;
$u = strpos($units, $u) + 1; // opraveny jmena promennych
$t[] = "jednotka: " . $u;
$n = $n * pow(2, $u * 10); // opravene na pow a opravene na binarni soustavu z dekadicke
$t[] = $n;
echo implode($t, "<br>");
?>
Prepokladam, ze tyhle 2 drobne zmeny pokud pochopi princip, uz si dokaze spravit kazdy zacatecnik. Lide, kteri nechteji samostatne pracovat, tak jim to nenutim.
pcmanik
Profil
peta:
Kebyže ho chceš naviesť, hodíš mu sem nejaké odkazy, poprípade teoreticky popíšeš ako to spraví, ale nie že mu sem dáš nefunkčný kód.

Hádam by si neprišiel pýtať niekto z "miliónového" projektu radu ako má napísať kód... Skôr by som od nich očakával, že by tu len niečo skonzultovali, poprípade aby sme ich usmernili. No určite nie robiť im kódy.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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