2013-03-07 63 views
5

我在想如果有内置的方式来使用Twig模板系统输出可读的文件大小。说我在我的模板是这样的:使用Twig模板系统的可读文件大小

<p>This limit is currently set to {{ maxBytes }}</p> 

我怎么能格式化maxBytes显示类似30 GB

+1

据我所知是没有定义的函数/过滤器来做到这一点。你唯一的解决方案是[扩展树枝](http://twig.sensiolabs.org/doc/advanced.html)。 – cheesemacfly 2013-03-07 20:50:24

回答

18

有几种方法你可以去实现这个目的:

1)得到一个枝杈扩展将处理它。一个像这样的:https://github.com/BrazilianFriendsOfSymfony/BFOSTwigExtensionsBundle

启用后你会只是做:

{{ maxBytes|bfos_format_bytes }} 

而且这会给你想要的东西。

2)如果您不想添加整个扩展名,您可以创建一个宏来执行此操作。这将是这个样子:

{% macro bytesToSize(bytes) %} 
{% spaceless %} 
    {% set kilobyte = 1024 %} 
    {% set megabyte = kilobyte * 1024 %} 
    {% set gigabyte = megabyte * 1024 %} 
    {% set terabyte = gigabyte * 1024 %} 

    {% if bytes < kilobyte %} 
     {{ bytes ~ ' B' }} 
    {% elseif bytes < megabyte %} 
     {{ (bytes/kilobyte)|number_format(2, '.') ~ ' KB' }} 
    {% elseif bytes < gigabyte %} 
     {{ (bytes/megabyte)|number_format(2, '.') ~ ' MB' }} 
    {% elseif bytes < terabyte %} 
     {{ (bytes/gigabyte)|number_format(2, '.') ~ ' GB' }} 
    {% else %} 
     {{ (bytes/terabyte)|number_format(2, '.') ~ ' TB' }} 
    {% endif %} 
{% endspaceless %} 
{% endmacro %} 

你可以阅读更多有关放在哪里以及如何使用此宏:http://twig.sensiolabs.org/doc/tags/macro.html

9

或者,只需要创建一个树枝延伸:

ByteConversionTwigExtension。 PHP

<?php 
// src/AppBundle/Twig/Extension 

namespace AppBundle\Twig\Extension; 


class ByteConversionTwigExtension extends \Twig_Extension 
{ 


    /** 
    * Gets filters 
    * 
    * @return array 
    */ 
    public function getFilters() 
    { 
     return array(
      new \Twig_SimpleFilter('format_bytes', array($this, 'formatBytes')), 
     ); 
    }  

    public function getName() 
    { 
     return 'format_bytes'; 
    } 

    function formatBytes($bytes, $precision = 2) 
    { 
     $units = array('B', 'KB', 'MB', 'GB', 'TB'); 
     $bytes = max($bytes, 0); 
     $pow = floor(($bytes ? log($bytes) : 0)/log(1024)); 
     $pow = min($pow, count($units) - 1); 

     // Uncomment one of the following alternatives 
     $bytes /= pow(1024, $pow); 

     return round($bytes, $precision) . ' ' . $units[$pow]; 
    } 

} 

services.yml

parameters: 
    app.byte_conversion_twig_extension.twig.extension.class: AppBundle\Twig\Extension\ByteConversionTwigExtension 

services: 
    app.byte_conversion.twig.extension: 
     class: %app.byte_conversion_twig_extension.twig.extension.class% 
     tags: 
      - { name: twig.extension } 

Twigh模板:

{{ variable | format_bytes }} 
+0

要读取操作系统确实使用1000(KiB MiB GiB TiB)而不是1024 – Cassiano 2016-06-30 16:50:18

+0

请注意,KiB指的是KibiByte 1 KiB = 1024 B,KB指的是KiloByte为1KB = 1000字节。基洛总是代表国际体系单位的“时代千人”。另一方面,许多软件开发人员(即使是很熟悉的操作系统)都会混合所有这些单元,而不考虑公认的定义。 – 2017-09-06 13:23:09