是否有任何库为人类可读的文件大小单位(如Duration)提供对象/类具有implicits转换(来自Int,Long,Float)。
使用Duration
,您可以执行此操作:
11.millis
1.5.minutes
10.hours
我想知道是否有一些图书馆允许我这样做:
1.gibabyte
1024.megabytes
10.gibibytes
10.GB
50.GiB
我知道我可以自己实现这一点,但我试图不重新发明轮子。
答案 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)}"
}