android.text.format.Formatter.formatFileSize() 返回错误的格式

use*_*924 6 android

这里我比较了Android内置方法来格式化文件和自定义来自/sf/answers/391988971/

\n
Timber.d(\n    "Format file size using Formatter.formatFileSize " +\n            "${Formatter.formatFileSize(this, 1_000_000_000L)}, " +\n            "${Formatter.formatFileSize(this, 1_073_741_824L)}"\n)\n\nTimber.d(\n    "Format file size using readableFileSize " +\n            "${readableFileSize(1_000_000_000L)}, " +\n            "${readableFileSize(1_073_741_824L)}"\n)\n
Run Code Online (Sandbox Code Playgroud)\n

\n
fun readableFileSize(size: Long): String? {\n    if (size <= 0) return "0"\n    val units = arrayOf("B", "kB", "MB", "GB", "TB")\n    val digitGroups = (log10(size.toDouble()) / log10(1024.0)).toInt()\n    return DecimalFormat("#,##0.#").format(size / 1024.0.pow(digitGroups.toDouble()))\n        .toString() + " " + units[digitGroups]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是结果:

\n
Format file size using Formatter.formatFileSize 1,00\xc2\xa0GB, 1,07\xc2\xa0GB\nFormat file size using readableFileSize 953,7 MB, 1 GB\n
Run Code Online (Sandbox Code Playgroud)\n

出什么问题了android.text.format.Formatter.formatFileSize

\n

更新

\n

从 Oreo Android 开始,1 kb 使用 1000 个字节而不是 1024 个字节

\n

在此输入图像描述

\n

我们可以使用Formatter.formatFileSize(this, 1024L, Formatter.FLAG_IEC_UNITS)

\n

但第三个参数的方法隐藏在源代码中:

\n
/** @hide */\npublic static String formatFileSize(@Nullable Context context, long sizeBytes, int flags) {\n    if (context == null) {\n        return "";\n    }\n    final BytesResult res = formatBytes(context.getResources(), sizeBytes, flags);\n    return bidiWrap(context, context.getString(com.android.internal.R.string.fileSizeSuffix,\n            res.value, res.units));\n}\n
Run Code Online (Sandbox Code Playgroud)\n

所以似乎没有内置方法可以为较新的 Android 版本获取正常格式化的本地化文件大小

\n