PHP Human Readable filesize script always returns a “B”





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







-2















After thinking mine was in error,



I found LOT AT LOTS of scripts the do this:
https://gist.github.com/liunian/9338301



And there are several here at S.O. I used, but had the same annoying "B" as a size.



This issue seemed to rear it's ugly head when I switched to php v7.xxx
First issues is I have to typcase a floated number (or double) or else I get a
"A non well formed numeric value encountered"
After some research, apparently this is NOT a bug. At least that is how I read it.



So after typcasting it, the error goes away but the value returned is always a "B'
filesize = 87.5B (when it should be MB or GB).



I am pretty sure Javascript will work, but would rather keep it with php.



Thanks for looking



current live script that is producing a "B" only



 public function readableBytes($size,  $type='pc') { //ignore the pc - it is for something else - disabled for debugging
$size = (double)$size;
static $units = array('B','kB','MB','GB','TB','PB','EB','ZB','YB');
$step = 1024;
$i = 0;
while (($size / $step) > 0.9) {
$size = $size / $step;
$i++;
}
return round($size, 2).$units[$i];
}// function readbbleBytes









share|improve this question


















  • 2





    I've tried it and it seems to be able to produce other things - echo readableBytes(1000000); -> 0.95MB

    – Nigel Ren
    Nov 22 '18 at 20:06











  • Which version of PHP are you using, and on which OS (including wordsize - 32, or 64 bit), and what is shown if you var_dump($size); on the first line of the function?

    – Alister Bulman
    Nov 22 '18 at 20:08






  • 3





    Can't reproduce here. What is your input $size data?

    – Felippe Duarte
    Nov 22 '18 at 20:16






  • 1





    Working fine for me as well

    – miken32
    Nov 22 '18 at 20:26











  • proof: 3v4l.org/dOQkX

    – billynoah
    Nov 22 '18 at 20:30


















-2















After thinking mine was in error,



I found LOT AT LOTS of scripts the do this:
https://gist.github.com/liunian/9338301



And there are several here at S.O. I used, but had the same annoying "B" as a size.



This issue seemed to rear it's ugly head when I switched to php v7.xxx
First issues is I have to typcase a floated number (or double) or else I get a
"A non well formed numeric value encountered"
After some research, apparently this is NOT a bug. At least that is how I read it.



So after typcasting it, the error goes away but the value returned is always a "B'
filesize = 87.5B (when it should be MB or GB).



I am pretty sure Javascript will work, but would rather keep it with php.



Thanks for looking



current live script that is producing a "B" only



 public function readableBytes($size,  $type='pc') { //ignore the pc - it is for something else - disabled for debugging
$size = (double)$size;
static $units = array('B','kB','MB','GB','TB','PB','EB','ZB','YB');
$step = 1024;
$i = 0;
while (($size / $step) > 0.9) {
$size = $size / $step;
$i++;
}
return round($size, 2).$units[$i];
}// function readbbleBytes









share|improve this question


















  • 2





    I've tried it and it seems to be able to produce other things - echo readableBytes(1000000); -> 0.95MB

    – Nigel Ren
    Nov 22 '18 at 20:06











  • Which version of PHP are you using, and on which OS (including wordsize - 32, or 64 bit), and what is shown if you var_dump($size); on the first line of the function?

    – Alister Bulman
    Nov 22 '18 at 20:08






  • 3





    Can't reproduce here. What is your input $size data?

    – Felippe Duarte
    Nov 22 '18 at 20:16






  • 1





    Working fine for me as well

    – miken32
    Nov 22 '18 at 20:26











  • proof: 3v4l.org/dOQkX

    – billynoah
    Nov 22 '18 at 20:30














-2












-2








-2








After thinking mine was in error,



I found LOT AT LOTS of scripts the do this:
https://gist.github.com/liunian/9338301



And there are several here at S.O. I used, but had the same annoying "B" as a size.



This issue seemed to rear it's ugly head when I switched to php v7.xxx
First issues is I have to typcase a floated number (or double) or else I get a
"A non well formed numeric value encountered"
After some research, apparently this is NOT a bug. At least that is how I read it.



So after typcasting it, the error goes away but the value returned is always a "B'
filesize = 87.5B (when it should be MB or GB).



I am pretty sure Javascript will work, but would rather keep it with php.



Thanks for looking



current live script that is producing a "B" only



 public function readableBytes($size,  $type='pc') { //ignore the pc - it is for something else - disabled for debugging
$size = (double)$size;
static $units = array('B','kB','MB','GB','TB','PB','EB','ZB','YB');
$step = 1024;
$i = 0;
while (($size / $step) > 0.9) {
$size = $size / $step;
$i++;
}
return round($size, 2).$units[$i];
}// function readbbleBytes









share|improve this question














After thinking mine was in error,



I found LOT AT LOTS of scripts the do this:
https://gist.github.com/liunian/9338301



And there are several here at S.O. I used, but had the same annoying "B" as a size.



This issue seemed to rear it's ugly head when I switched to php v7.xxx
First issues is I have to typcase a floated number (or double) or else I get a
"A non well formed numeric value encountered"
After some research, apparently this is NOT a bug. At least that is how I read it.



So after typcasting it, the error goes away but the value returned is always a "B'
filesize = 87.5B (when it should be MB or GB).



I am pretty sure Javascript will work, but would rather keep it with php.



Thanks for looking



current live script that is producing a "B" only



 public function readableBytes($size,  $type='pc') { //ignore the pc - it is for something else - disabled for debugging
$size = (double)$size;
static $units = array('B','kB','MB','GB','TB','PB','EB','ZB','YB');
$step = 1024;
$i = 0;
while (($size / $step) > 0.9) {
$size = $size / $step;
$i++;
}
return round($size, 2).$units[$i];
}// function readbbleBytes






php






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 22 '18 at 19:59









Jake StoneJake Stone

508




508








  • 2





    I've tried it and it seems to be able to produce other things - echo readableBytes(1000000); -> 0.95MB

    – Nigel Ren
    Nov 22 '18 at 20:06











  • Which version of PHP are you using, and on which OS (including wordsize - 32, or 64 bit), and what is shown if you var_dump($size); on the first line of the function?

    – Alister Bulman
    Nov 22 '18 at 20:08






  • 3





    Can't reproduce here. What is your input $size data?

    – Felippe Duarte
    Nov 22 '18 at 20:16






  • 1





    Working fine for me as well

    – miken32
    Nov 22 '18 at 20:26











  • proof: 3v4l.org/dOQkX

    – billynoah
    Nov 22 '18 at 20:30














  • 2





    I've tried it and it seems to be able to produce other things - echo readableBytes(1000000); -> 0.95MB

    – Nigel Ren
    Nov 22 '18 at 20:06











  • Which version of PHP are you using, and on which OS (including wordsize - 32, or 64 bit), and what is shown if you var_dump($size); on the first line of the function?

    – Alister Bulman
    Nov 22 '18 at 20:08






  • 3





    Can't reproduce here. What is your input $size data?

    – Felippe Duarte
    Nov 22 '18 at 20:16






  • 1





    Working fine for me as well

    – miken32
    Nov 22 '18 at 20:26











  • proof: 3v4l.org/dOQkX

    – billynoah
    Nov 22 '18 at 20:30








2




2





I've tried it and it seems to be able to produce other things - echo readableBytes(1000000); -> 0.95MB

– Nigel Ren
Nov 22 '18 at 20:06





I've tried it and it seems to be able to produce other things - echo readableBytes(1000000); -> 0.95MB

– Nigel Ren
Nov 22 '18 at 20:06













Which version of PHP are you using, and on which OS (including wordsize - 32, or 64 bit), and what is shown if you var_dump($size); on the first line of the function?

– Alister Bulman
Nov 22 '18 at 20:08





Which version of PHP are you using, and on which OS (including wordsize - 32, or 64 bit), and what is shown if you var_dump($size); on the first line of the function?

– Alister Bulman
Nov 22 '18 at 20:08




3




3





Can't reproduce here. What is your input $size data?

– Felippe Duarte
Nov 22 '18 at 20:16





Can't reproduce here. What is your input $size data?

– Felippe Duarte
Nov 22 '18 at 20:16




1




1





Working fine for me as well

– miken32
Nov 22 '18 at 20:26





Working fine for me as well

– miken32
Nov 22 '18 at 20:26













proof: 3v4l.org/dOQkX

– billynoah
Nov 22 '18 at 20:30





proof: 3v4l.org/dOQkX

– billynoah
Nov 22 '18 at 20:30












2 Answers
2






active

oldest

votes


















0














This is a unique issue to those that use a loop for assigning (custom)template tags with an array field.



The filesize is one of many fields in an array I use.



I used a loop to go through each field and assign it to a template tag.
Not sure why the "B" came up. My suspicion is that the result of a "string" = 0 bytes. Even though It showed the actual size.
edit: spelling & claification
So to fix, in the middle of the loop, I forced the $array['filesize'] = readableBytes($array['filesize'])).
Before it was loop tag = fieldname.



foreach ($arr as $field=>$data) {
$arr['filesize'] = readableBytes($array['filesize'])); // fix was put here
$page = str_ireplace("{$field}", $data, $page);
}





share|improve this answer

































    -1














    The following seems to work (checked in phptester):



    function human_filesize($bytes, $decimals = 2)
    {
    if ($bytes < 1024) {
    return $bytes . ' B';
    }

    $factor = floor(log($bytes, 1024));
    return sprintf("%.{$decimals}f ", $bytes / pow(1024, $factor)) . ['B', 'KB', 'MB', 'GB', 'TB', 'PB'][$factor];
    }


    This is a cut and paste of a post by gladx in the following thread, where you'll find several optimised examples: https://gist.github.com/liunian/9338301#gistcomment-2183132






    share|improve this answer
























      Your Answer






      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "1"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: true,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: 10,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53437394%2fphp-human-readable-filesize-script-always-returns-a-b%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      0














      This is a unique issue to those that use a loop for assigning (custom)template tags with an array field.



      The filesize is one of many fields in an array I use.



      I used a loop to go through each field and assign it to a template tag.
      Not sure why the "B" came up. My suspicion is that the result of a "string" = 0 bytes. Even though It showed the actual size.
      edit: spelling & claification
      So to fix, in the middle of the loop, I forced the $array['filesize'] = readableBytes($array['filesize'])).
      Before it was loop tag = fieldname.



      foreach ($arr as $field=>$data) {
      $arr['filesize'] = readableBytes($array['filesize'])); // fix was put here
      $page = str_ireplace("{$field}", $data, $page);
      }





      share|improve this answer






























        0














        This is a unique issue to those that use a loop for assigning (custom)template tags with an array field.



        The filesize is one of many fields in an array I use.



        I used a loop to go through each field and assign it to a template tag.
        Not sure why the "B" came up. My suspicion is that the result of a "string" = 0 bytes. Even though It showed the actual size.
        edit: spelling & claification
        So to fix, in the middle of the loop, I forced the $array['filesize'] = readableBytes($array['filesize'])).
        Before it was loop tag = fieldname.



        foreach ($arr as $field=>$data) {
        $arr['filesize'] = readableBytes($array['filesize'])); // fix was put here
        $page = str_ireplace("{$field}", $data, $page);
        }





        share|improve this answer




























          0












          0








          0







          This is a unique issue to those that use a loop for assigning (custom)template tags with an array field.



          The filesize is one of many fields in an array I use.



          I used a loop to go through each field and assign it to a template tag.
          Not sure why the "B" came up. My suspicion is that the result of a "string" = 0 bytes. Even though It showed the actual size.
          edit: spelling & claification
          So to fix, in the middle of the loop, I forced the $array['filesize'] = readableBytes($array['filesize'])).
          Before it was loop tag = fieldname.



          foreach ($arr as $field=>$data) {
          $arr['filesize'] = readableBytes($array['filesize'])); // fix was put here
          $page = str_ireplace("{$field}", $data, $page);
          }





          share|improve this answer















          This is a unique issue to those that use a loop for assigning (custom)template tags with an array field.



          The filesize is one of many fields in an array I use.



          I used a loop to go through each field and assign it to a template tag.
          Not sure why the "B" came up. My suspicion is that the result of a "string" = 0 bytes. Even though It showed the actual size.
          edit: spelling & claification
          So to fix, in the middle of the loop, I forced the $array['filesize'] = readableBytes($array['filesize'])).
          Before it was loop tag = fieldname.



          foreach ($arr as $field=>$data) {
          $arr['filesize'] = readableBytes($array['filesize'])); // fix was put here
          $page = str_ireplace("{$field}", $data, $page);
          }






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Nov 23 '18 at 23:16

























          answered Nov 22 '18 at 22:15









          Jake StoneJake Stone

          508




          508

























              -1














              The following seems to work (checked in phptester):



              function human_filesize($bytes, $decimals = 2)
              {
              if ($bytes < 1024) {
              return $bytes . ' B';
              }

              $factor = floor(log($bytes, 1024));
              return sprintf("%.{$decimals}f ", $bytes / pow(1024, $factor)) . ['B', 'KB', 'MB', 'GB', 'TB', 'PB'][$factor];
              }


              This is a cut and paste of a post by gladx in the following thread, where you'll find several optimised examples: https://gist.github.com/liunian/9338301#gistcomment-2183132






              share|improve this answer




























                -1














                The following seems to work (checked in phptester):



                function human_filesize($bytes, $decimals = 2)
                {
                if ($bytes < 1024) {
                return $bytes . ' B';
                }

                $factor = floor(log($bytes, 1024));
                return sprintf("%.{$decimals}f ", $bytes / pow(1024, $factor)) . ['B', 'KB', 'MB', 'GB', 'TB', 'PB'][$factor];
                }


                This is a cut and paste of a post by gladx in the following thread, where you'll find several optimised examples: https://gist.github.com/liunian/9338301#gistcomment-2183132






                share|improve this answer


























                  -1












                  -1








                  -1







                  The following seems to work (checked in phptester):



                  function human_filesize($bytes, $decimals = 2)
                  {
                  if ($bytes < 1024) {
                  return $bytes . ' B';
                  }

                  $factor = floor(log($bytes, 1024));
                  return sprintf("%.{$decimals}f ", $bytes / pow(1024, $factor)) . ['B', 'KB', 'MB', 'GB', 'TB', 'PB'][$factor];
                  }


                  This is a cut and paste of a post by gladx in the following thread, where you'll find several optimised examples: https://gist.github.com/liunian/9338301#gistcomment-2183132






                  share|improve this answer













                  The following seems to work (checked in phptester):



                  function human_filesize($bytes, $decimals = 2)
                  {
                  if ($bytes < 1024) {
                  return $bytes . ' B';
                  }

                  $factor = floor(log($bytes, 1024));
                  return sprintf("%.{$decimals}f ", $bytes / pow(1024, $factor)) . ['B', 'KB', 'MB', 'GB', 'TB', 'PB'][$factor];
                  }


                  This is a cut and paste of a post by gladx in the following thread, where you'll find several optimised examples: https://gist.github.com/liunian/9338301#gistcomment-2183132







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Nov 22 '18 at 20:18









                  Eric VautierEric Vautier

                  943




                  943






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Stack Overflow!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53437394%2fphp-human-readable-filesize-script-always-returns-a-b%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Biblatex bibliography style without URLs when DOI exists (in Overleaf with Zotero bibliography)

                      ComboBox Display Member on multiple fields

                      Is it possible to collect Nectar points via Trainline?