"PHP" / Говнокод #3299 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
function formatbytes($file, $type)  
{  
    switch($type){  
        case "KB":  
            $filesize = filesize($file) * .0009765625; // bytes to KB  
        break;  
        case "MB":  
            $filesize = (filesize($file) * .0009765625) * .0009765625; // bytes to MB  
        break;  
        case "GB":  
            $filesize = ((filesize($file) * .0009765625) * .0009765625) * .0009765625; // bytes to GB  
        break;  
    }  
    if($filesize <= 0){  
        return $filesize = 'unknown file size';}  
    else{return round($filesize, 2).' '.$type;}  
}

Вот так мы выводим размер файлика.

Запостил: begmst begmst, (Updated )

Комментарии (26) RSS

  • А мне нравится сам бы так написал. :)))))
    А вообще я хотел быть участковым!
    Ответить
  • Да-да, побольше магических цифер в коде!!
    Пусть те, кто читает, потом догадываются - это ваше любимое число, расстояние до вашей любимой звезды или день рождения вашей мамы.
    Ответить
  • Оригинально.
    Можно было бы загнать это магическое число в отдельную переменную.
    Не говнокод. Потери в точности нет.
    Ответить
  • Потери точности то нет, но
    1. длина кода при делении была бы меньше
    ((filesize($file) * .0009765625) * .0009765625) * .0009765625
    vs
    filesize($file) / 1024 / 1024 / 1024
    2. Каждый программист за наносекунду поймёт, что такое 1024
    3. И всё таки лучше было определить константы
    4. Зачем здесь тонна скобок?
    Ответить
    • я лично в качестве делителя пользуюсь либо 1000 либо (2*1024+512).

      делитель 1000 ловит момент когда в десятичном пердставлении становится на одну цифру больше. иногда оно не катит (0.9МБ не всегда эротично либо 1.1МБ не достаточно точно), тогда я пользуюсь делителем 2.5К: до 2.5МБ все будет печататься в КБ. до 2.5ГБ - в МБ. и точности достаточно и как бы в общем случае красивше.
      Ответить
  • Можно избавиться от кучи операций (упрощенно) вот так:
    $div = 1;
    switch ($type) {
        case 'GB': $div <<= 10;
        case 'MB': $div <<= 10;
        case 'KB': $div <<= 10;
    }
    return $filesize / $div;
    Ответить
    • побитовый сдвиг и возможности кэйса - это охуенно чувак )
      Ответить
        • все супер. пример со сдвигом и кейсом должен уйти как пример в учебники по программированию. это высший пилотаж )) без подъеба.
          Ответить
    • Ха круто) люблю такие вот маленькие кусочки кода, в которых используется знания, недоступные говнокодеру =) и самое главно - моск =)
      Ответить
      • умничать можно в других местах, а не в коде.
        код должен быть удобочитаемым.
        вот эти << 10 это не лучшая идея!!!
        Ответить
        • Да? Ну-ка приведи лучший вариант.

          Для меня данный вариант является удобочитаемым на все 100% А если кому-то приходится думать, чтобы понять, что тут твориться, может стоит задуматься, знаете ли вы этот язык?
          Ответить
    • Правда всюду сдвиг на 10, но смысл понятен. Не работает, когда нужно показать дробную часть типа 2,5 KB
      Ответить
  • Очень давно где-то читал что умножение немного быстрее деления.
    Код прикольный.
    Ответить
  • а почему бы уж сразу не умножать на 0,00000095367431640625 и 0,000000000931322574615478515625?
    Ответить
  • Хм, довольно длительное время пользуюсь нижеследующей функцией, но после приведенного здесь "сдвига" попробую сделать что-то другое ) Например завернуть в цикл )
    /* 123456 => 120.6 KB, 1234567890 => 1.1 GB */
    public static function bytes( $n ) {
    	$nbsp = "\xC2\xA0"; /* Non-breaking space in UTF-8 */
    	$ar_byte_units = explode( ' ', 'B KB MB GB TB PB EB' );
    	if ( $n <= pow( 2, 10 ) ) { return $n.$nbsp.$ar_byte_units[0]; }
    	else if ( $n <= pow( 2, 20 ) ) { return self::number_format( $n / pow( 2, 10 ), 1 ).$nbsp.$ar_byte_units[1]; }
    	else if ( $n <= pow( 2, 30 ) ) { return self::number_format( $n / pow( 2, 20 ), 1 ).$nbsp.$ar_byte_units[2]; }
    	else if ( $n <= pow( 2, 40 ) ) { return self::number_format( $n / pow( 2, 30 ), 1 ).$nbsp.$ar_byte_units[3]; }
    	else if ( $n <= pow( 2, 50 ) ) { return self::number_format( $n / pow( 2, 40 ), 1 ).$nbsp.$ar_byte_units[4]; }
    	else if ( $n <= pow( 2, 60 ) ) { return self::number_format( $n / pow( 2, 50 ), 1 ).$nbsp.$ar_byte_units[5]; }
    	else if ( $n <= pow( 2, 70 ) ) { return self::number_format( $n / pow( 2, 60 ), 1 ).$nbsp.$ar_byte_units[6]; }
    	return $n;
    }
    Ответить
    • Написал, но после числа 1073741824 перестает работать. 🙁
      function more_bytes( $n ) {
      	$nbsp = ' ';
      	$div = 1;
      	foreach ( explode( ' ', 'B KB MB GB TB PB EB' ) as $byte_unit ) {
      		$div <<= 10;
      		if ( $n <= $div ) {
      			return number_format( $n / ( $div >> 10 ), 1 ) . $nbsp . $byte_unit; 
      		}
      	}
      	return $n;
      }
      Ответить
      • ok for me
        function more_bytes( $n ) {
        	$nbsp = ' ';
        	foreach ( explode( ' ', 'B KB MB GB TB PB EB' ) as $cnt => $byte_unit ) {
        		if ( $n < pow( 2, 10 * ( $cnt + 1 ) ) ) {
        			return number_format( $n / pow( 2, 10 * $cnt ), ( $cnt ? 1 : 0 ) ) . $nbsp . $byte_unit; 
        		}
        	}
        	return $n;
        }
        Ответить
        • function bytes( $n ) {
          foreach(explode(' ','B KB MB GB TB PB EB')as$c=>$u)if($n<pow(2,10*($c+1)))return number_format($n/pow(2,10*$c),$c?1:0).' '.$u;
          return $n;
          }
          Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8