如何在Kotlin中将字节大小转换为人类可读的格式?

时间:2019-12-08 11:29:01

标签: kotlin formatting

未能在StackOverflow中找到类似的主题,问题类似于How to convert byte size into human readable format in java?

  

如何在Java中将字节大小转换为可读格式?像1024应该变成“ 1 Kb”,而1024 * 1024应该变成“ 1 Mb”。

     

我有点讨厌为每个项目编写此实用程序方法。 Apache Commons中是否有任何静态方法?

但是对于Kotlin来说,他已经基于the accepted answer there编写了一些东西并希望与他人分享,但是认为应该将其发布在单独的线程中最好不要分散人们对该线程的注意力,以便其他人也可以评论或发布其他惯用的Kotlin在这里回答

2 个答案:

答案 0 :(得分:1)

基于@aioobe的this Java代码:

fun humanReadableByteCountBin(bytes: Long) = when {
    bytes == Long.MIN_VALUE || bytes < 0 -> "N/A"
    bytes < 1024L -> "$bytes B"
    bytes <= 0xfffccccccccccccL shr 40 -> "%.1f KiB".format(bytes.toDouble() / (0x1 shl 10))
    bytes <= 0xfffccccccccccccL shr 30 -> "%.1f MiB".format(bytes.toDouble() / (0x1 shl 20))
    bytes <= 0xfffccccccccccccL shr 20 -> "%.1f GiB".format(bytes.toDouble() / (0x1 shl 30))
    bytes <= 0xfffccccccccccccL shr 10 -> "%.1f TiB".format(bytes.toDouble() / (0x1 shl 40))
    bytes <= 0xfffccccccccccccL -> "%.1f PiB".format((bytes shr 10).toDouble() / (0x1 shl 40))
    else -> "%.1f EiB".format((bytes shr 20).toDouble() / (0x1 shl 40))
}

可以通过使用ULong删除第一个条件来进行改进,但是该语言将当前类型(2019年)标记为实验性。在Locale.ENGLISH之前添加.format(以确保不会在具有不同数字的语言环境中转换数字。

让我知道可以进行哪些改进以使其变得更惯用和更具可读性。

答案 1 :(得分:0)

由于我的用例用于Android,事实证明https://stackoverflow.com/a/26502430对我来说足够了,只想提一下我的代码最后的结果。

Xms

android.text.format.Formatter.formatShortFileSize(activityContext, bytes)