Cenário: o tamanho de vários arquivos é armazenado em um banco de dados como bytes. Qual é a melhor maneira de formatar essas informações de tamanho em kilobytes, megabytes e gigabytes? Por exemplo, eu tenho um MP3 que o Ubuntu exibe como "5,2 MB (5445632 bytes)". Como eu exibia isso em uma página da Web como "5,2 MB" E arquivos com menos de um megabyte como KB e arquivos com um gigabyte e acima como GB?
184
Respostas:
(Extraído do php.net , existem muitos outros exemplos, mas eu gosto mais deste :-)
fonte
$bytes /= (1 << (10 * $pow))
ou algo parecido, eu poderia gostar melhor. :-PKiB
,MiB
,GiB
eTiB
desde que você está dividindo por1024
. Se você dividir por1000
seria sem oi
.Uncomment one of the following alternatives
era algo que eu não percebi por 5 minutos ...Esta é a implementação de Chris Jester-Young, a mais limpa que eu já vi, combinada com o php.net e um argumento de precisão.
fonte
$suffixes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
eu quero um disco rígido de Yottabyte! :-PformatBytes(259748192, 3)
retornos259748192 MB
que não é certoPseudo-código:
fonte
Esta é a implementação do Kohana , você pode usá-lo:
fonte
$force_unit
e$si
parece fazer a mesma coisa. Você também pode passar qualquer string com um "i" para$force_unit
, porque eles testam a posição. A formatação decimal também é um exagero.Apenas divida-o por 1024 para kb, 1024 ^ 2 para mb e 1024 ^ 3 para GB. Tão simples como isso.
fonte
Apenas minha alternativa, curta e limpa:
ou, mais estúpido e eficaz:
fonte
use esta função se desejar um código curto
bcdiv ()
fonte
Sei que talvez seja um pouco tarde para responder a essa pergunta, mas mais dados não vão matar alguém. Aqui está uma função muito rápida:
EDIT: eu atualizei minha postagem para incluir a correção proposta por camomileCase:
fonte
Função simples
fonte
Solução flexível:
fonte
Eu consegui com a seguinte função,
fonte
Minha abordagem
fonte
Não sei por que você deve tornar as coisas tão complicadas quanto as outras.
O código a seguir é muito mais simples de entender e cerca de 25% mais rápido que as outras soluções que usam a função de log (chamada de função 20 milhões de vezes com parâmetros diferentes)
fonte
Fiz isso convertendo todas as entradas em bytes e, assim, convertendo para qualquer saída necessária. Além disso, usei uma função auxiliar para obter a base 1000 ou 1024, mas a deixei flexível para decidir usar 1024 no tipo popular (sem 'i', como MB em vez de MiB).
fonte
tente isso;)
fonte
fonte
Basta chamar a função
fonte
Este trabalho com o último PHP
fonte
Embora um pouco obsoleta, essa biblioteca oferece uma API de conversão robusta e testada :
https://github.com/gabrielelana/byte-units
Uma vez instalado:
E para converter na outra direção:
Além da conversão básica, oferece métodos de adição, subtração, comparação, etc.
Eu não sou de forma alguma afiliado a esta biblioteca.
fonte
fonte
Aqui está a implementação simplificada da função Drupal format_size :
fonte
É um pouco tarde, mas uma versão um pouco mais rápida da resposta aceita está abaixo:
É mais eficiente, devido à realização de uma única operação log-2 em vez de duas operações log-e.
Na verdade, é mais rápido fazer a solução mais óbvia abaixo:
Isso ocorre porque o índice é calculado ao mesmo tempo que o valor do número de bytes na unidade apropriada. Isso reduziu o tempo de execução em cerca de 35% (um aumento de velocidade de 55%).
fonte
Outra implementação condensada que pode ser traduzida para a base 1024 (binária) ou a base 1000 (decimal) e também funciona com números incrivelmente grandes, portanto, do uso da biblioteca bc:
fonte
bcpow()
lançará a exceção TypeError se$base
e$i
não for valores de sequência. Testado no PHP versão 7.0.11.Imaginei que adicionaria uma malha de código de dois remetentes (usando o código de John Himmelman, que está neste segmento, e usando o código de Eugene Kuzmenko ) que estou usando.
Isso usa o código de Eugene para formatar os
$value
bytes (eu mantenho meus dados em MB e os converte:10485760 MB
em10995116277760
) - depois usa o código de John para convertê-los no valor de exibição adequado (10995116277760
em10 TB
).Achei isso muito útil - então, meus agradecimentos aos dois participantes!
fonte
Função extremamente simples para obter o tamanho do arquivo humano.
Fonte original: http://php.net/manual/de/function.filesize.php#106569
Copie / cole o código:
fonte
Eu desenvolvi minha própria função que converte o tamanho da memória legível humana em tamanhos diferentes.
Essa função aceita qualquer abreviação de tamanho de memória como "Megabyte, MB, Mb, mb, m, kilobyte, K, KB, b, Terabyte, T ....", portanto, é seguro contra erros de digitação.
fonte
Com base na resposta de Leo , adicione
Se você deseja unidade máxima para Mega, mude para
$units = explode(' ', ' K M');
fonte