1. PHP / Говнокод #3299

    +170

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 24 Мая 2010

    Комментарии (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
        Ответить
    • Очень давно где-то читал что умножение немного быстрее деления.
      Код прикольный.
      Ответить
      • экономия на спичках. у нас не асм на 51.
        Ответить
    • а почему бы уж сразу не умножать на 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;
            }
            Ответить
            • вот так вот, не спеша, ты скатился к говнокоду
              Ответить
            • Вы извращенец, молодой человек.
              Ответить
      • EB - это ебайты?
        Ответить
        • Вам нужно прочесть мою книгу "Основы ПК". Нет, там идёт речь не о том, как пкшить нубов в ноугрейде, а вот о чем:
          http://img-fotki.yandex.ru/get/4300/yrtimd.1/0_3b375_3f9c0bf5_XL
          Ответить
          • твоя книга? ты же не осилил без ошибки написать слово 'конкатенация', или это все специально чтоб быть ближе к нубам? =)
            Ответить
          • Черт, как же изменился язык:)
            Я даже не знаю, что такое ноугрейд.
            Ответить

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