2016-02-24 48 views
1

是否有任何庫爲可讀文件大小單位(如Duration)提供帶有隱式轉換(來自Int,Long,Float)的對象/類。scala代碼的人類可讀大小單位(文件大小)(如持續時間)

隨着Duration你可以這樣做:

11.millis 
1.5.minutes 
10.hours 

我不知道是否有一些庫,讓我做的事:

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

我知道我可以實現這個我自己,但我試圖不要重新發明輪子。

+0

你可以嘗試微博的Util:https://github.com/twitter/util#space – Eric

+0

@Eric這是非常好的alternavie!我正在使用twitter utils,並不知道他們有這個。不幸的是,他們使用千兆字節作爲1204兆字節(基數2)。既然現在我們有技嘉和Gibibyte(基數10和基數2),我想避免含糊不清。 –

回答

1

我剛剛偶然發現了squants。正如在自己的網站聲稱:

Squants是數據類型的框架和代表數量,它們的度量單位,和他們 尺寸關係的領域特定語言 (DSL)。該API支持類型安全的維度分析,改進的域模型等等。所有類型都是不可變的,並且線程安全。

隨着squants你可以這樣做:

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

雖然我不喜歡那個單位符號全部小寫(即扁栓代替GIB)

1

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)}" 
    }