scala代码的人类可读大小单位(文件大小)(如持续时间)

时间:2016-02-24 17:59:09

标签: scala

是否有任何库为人类可读的文件大小单位(如Duration)提供对象/类具有implicits转换(来自Int,Long,Float)。

使用Duration,您可以执行此操作:

11.millis
1.5.minutes
10.hours

我想知道是否有一些图书馆允许我这样做:

1.gibabyte
1024.megabytes
10.gibibytes
10.GB
50.GiB

我知道我可以自己实现这一点,但我试图不重新发明轮子。

2 个答案:

答案 0 :(得分:3)

我偶然发现squants。如他们自己的网站所述:

  

Squants是数据类型和特定领域语言的框架   (DSL)用于表示数量,其度量单位及其数量   维度关系。 API支持类型安全维度   分析,改进的领域模型等。所有类型都是不可变的   线程安全的。

你可以这样做:

10.kib
10.kibibytes
50.mib
100.gib

虽然我不喜欢单位符号都是小写的(即gib而不是GiB)

答案 1 :(得分:3)

Squants是一个很好的解决方案,特别是如果您不仅需要从lib进行人类可读的字节大小转换,而且另一种可能性是使用从old SO java solution移植的这个简单的4行解决方案。您今天可能不需要ZB and YB,但将来可能不需要;)

  /**
    * @see https://stackoverflow.com/questions/3263892/format-file-size-as-mb-gb-etc
    * @see https://en.wikipedia.org/wiki/Zettabyte
    * @param fileSize Up to Exabytes
    * @return
    */
  def humanReadableByteSize(fileSize: Long): String = {
    if(fileSize <= 0) return "0 B"
    // kilo, Mega, Giga, Tera, Peta, Exa, Zetta, Yotta
    val units: Array[String] = Array("B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
    val digitGroup: Int = (Math.log10(fileSize)/Math.log10(1024)).toInt
    f"${fileSize/Math.pow(1024, digitGroup)}%3.3f ${units(digitGroup)}"
  }