文档
基本使用
依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.22</version>
</dependency>
示例
package com.example.demo;
import org.junit.Test;
import cn.hutool.core.io.unit.DataSizeUtil;
public class DataSizeTests {
@Test
public void testDataSize() {
long b = 1L;
long kb = 1024L + 512L;
long mb = 1024L * 1024L;
long gb = 1024L * 1024L * 1024L;
long tb = 1024L * 1024L * 1024L * 1024L;
System.out.println(DataSizeUtil.format(b)); // 1 B
System.out.println(DataSizeUtil.format(kb)); // 1.5 KB
System.out.println(DataSizeUtil.format(mb)); // 1 MB
System.out.println(DataSizeUtil.format(gb)); // 1 GB
System.out.println(DataSizeUtil.format(tb)); // 1 TB
}
}
代码实现
看下他的实现方式
package cn.hutool.core.io.unit;
import java.text.DecimalFormat;
/**
* 数据大小工具类
*
* @author looly
* @since 5.3.10
*/
public class DataSizeUtil {
/**
* 解析数据大小字符串,转换为bytes大小
*
* @param text 数据大小字符串,类似于:12KB, 5MB等
* @return bytes大小
*/
public static long parse(String text) {
return DataSize.parse(text).toBytes();
}
/**
* 可读的文件大小<br>
* 参考 http://stackoverflow.com/questions/3263892/format-file-size-as-mb-gb-etc
*
* @param size Long类型大小
* @return 大小
*/
public static String format(long size) {
if (size <= 0) {
return "0";
}
int digitGroups = Math.min(DataUnit.UNIT_NAMES.length-1, (int) (Math.log10(size) / Math.log10(1024)));
return new DecimalFormat("#,##0.##")
.format(size / Math.pow(1024, digitGroups)) + " " + DataUnit.UNIT_NAMES[digitGroups];
}
}
可以看到format方法,取了1204为底的对数,代码很简洁
自定义实现代码
package com.example.demo;
import java.text.DecimalFormat;
public class DataSizeUtil {
// 单位大小
public static final int UNIT_SIZE = 1024;
// 显示单位
public static final String[] UNIT_NAMES = new String[]{
"B", "KB", "MB", "GB", "TB", "PB", "EB"
};
/**
* 可读的文件大小
*
* @param size long
* @return
*/
public static String format(long size) {
if (size <= 0) {
return "0";
}
int digitGroups = Math.min(UNIT_NAMES.length - 1, (int) (Math.log10(size) / Math.log10(UNIT_SIZE)));
String value = new DecimalFormat("#.#").format(size / Math.pow(UNIT_SIZE, digitGroups));
return String.format("%s %s", value, UNIT_NAMES[digitGroups]);
}
}
补充知识
换底公式
$$ \log_a b = \log_c b \div \log_c a $$
DecimalFormat
DecimalFormat 用于数字格式化
package com.example.demo;
import org.junit.Test;
import java.text.DecimalFormat;
public class DecimalFormatTests {
@Test
public void testDecimalFormat(){
double pi = 3.141592653;
System.out.println(new DecimalFormat(".0").format(pi)); // 3.1
System.out.println(new DecimalFormat("0.0").format(pi)); // 3.1
System.out.println(new DecimalFormat("00.0").format(pi)); // 03.1
System.out.println(new DecimalFormat(".#").format(pi)); // 3.1
System.out.println(new DecimalFormat("#.#").format(pi)); // 3.1
System.out.println(new DecimalFormat("##.#").format(pi)); // 3.1
System.out.println(new DecimalFormat(".#").format((int)pi)); // 3.0
System.out.println(new DecimalFormat(".0").format((int)pi)); // 3.0
System.out.println(new DecimalFormat("0.0").format((int)pi)); // 3.0
System.out.println(new DecimalFormat("#.#").format((int)pi)); // 3
}
}
参考
- https://katex.org/docs/supported
- 根据文件大小自动转换kb、mb实现工具
- https://stackoverflow.com/questions/3263892/format-file-size-as-mb-gb-etc
- java格式化数字 NumberFormat及DecimalFormat