这里我比较了Android内置方法来格式化文件和自定义来自/sf/answers/391988971/
\nTimber.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)\nRun Code Online (Sandbox Code Playgroud)\n。
\nfun 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}\nRun Code Online (Sandbox Code Playgroud)\n这是结果:
\nFormat file size using Formatter.formatFileSize 1,00\xc2\xa0GB, 1,07\xc2\xa0GB\nFormat file size using readableFileSize 953,7 MB, 1 GB\nRun Code Online (Sandbox Code Playgroud)\n出什么问题了android.text.format.Formatter.formatFileSize?
更新
\n从 Oreo Android 开始,1 kb 使用 1000 个字节而不是 1024 个字节
\n\n我们可以使用Formatter.formatFileSize(this, 1024L, Formatter.FLAG_IEC_UNITS)
但第三个参数的方法隐藏在源代码中:
\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}\nRun Code Online (Sandbox Code Playgroud)\n所以似乎没有内置方法可以为较新的 Android 版本获取正常格式化的本地化文件大小
\n