string - 在 Freemarker 中是否有一种方便的方法来格式化人类可读的字节大小字符串?

标签 string numbers format freemarker

这个问题对于 Java 有很多答案( How to convert byte size into human readable format in java?Format file size as MB, GB etc )和 even for Groovy/Grails ,更不用说PHP ,但是在 FreeMarker 中是否有内置或方便的方法来执行此操作?

为了清楚起见,我追求的是通用术语中的通用 SI 方法,而不是 2 的二进制幂。例如

      1 ➤ 1B
    123 ➤ 123B
   1000 ➤ 1KB
   1728 ➤ 1.7KB
7077888 ➤ 7.1MB

等等。

鉴于 FreeMarker 似乎没有对数函数,有没有办法在纯 FreeMarker 中执行此操作,或者是我使用 Java 创建模板方法的唯一选择。

最佳答案

如果有人感兴趣,我自己尝试使用字符串操作编写一些代码。如果您可以避免的话,我不建议您这样做,但如果您遇到困难,它可能会有所帮助:

<#--
 # Format Number of Bytes in SI Units
 # -->
<#function si num>
  <#assign order     = num?round?c?length />
  <#assign thousands = ((order - 1) / 3)?floor />
  <#if (thousands < 0)><#assign thousands = 0 /></#if>
  <#assign siMap = [ {"factor": 1, "unit": ""}, {"factor": 1000, "unit": "K"}, {"factor": 1000000, "unit": "M"}, {"factor": 1000000000, "unit":"G"}, {"factor": 1000000000000, "unit": "T"} ]/>
  <#assign siStr = (num / (siMap[thousands].factor))?string("0.#") + siMap[thousands].unit />
  <#return siStr />
</#function>

关于string - 在 Freemarker 中是否有一种方便的方法来格式化人类可读的字节大小字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20602784/

相关文章:

c - 尝试创建子字符串时断言失败错误

java - 检测字符串中的不完整模式

c - 生成一个没有给定数字的随机数

java - 在java中获取日期的星期几的一个字母缩写

c++ - 为什么 cin 在包含字符串头后接受字符串输入

c++ - 将字符串中的第一个大写字母转换为小写字母

css - parseInt(number) 不起作用

PHP 数字格式 4 位

sql - 如何将数字格式化为带有千位分隔符的varchar?像oracle to_char()

c# - .NET String.Format() 在数字的千位添加逗号