您的位置:首页 > 其它

配置文件中提供解析带单位数字功能的工具类ByteNumber

2013-07-08 15:32 459 查看
这个小工具类可以将配置文件中设置的例如文件的大小限制之类的值转化为基本单位的数值,例如将1.2K转化为1.2*1024

支持B,K[B],M[B],G[B],T[B]并且大小写不敏感,中括号中的字母为可选,如果给定的字符串无法正确解析,则获取的值为0;

通过一个数值或者一个正确的字符串构造ByteNumber对象,然后可以通过getValue()方法返回一个long值(小数会被忽略),也可以通过getValue(char)给定一个单位字符来获取在该单位下的数值,单位常量在类中,建议使用类中的常量来获取,支持[B|K|M|G|T],大小写不敏感。

import java.util.HashMap;
import java.util.Map;

/**
* 二进制数字类。
*
* 支持从数值或者带单位的字符串中创建。
*
* @author Sam
*
*/
public final class ByteNumber
{
public static final Character UNIT_B = 'B';
public static final Character UNIT_K = 'K';
public static final Character UNIT_M = 'M';
public static final Character UNIT_G = 'G';
public static final Character UNIT_T = 'T';

/** 单位字母 */
private static final Map<Character, Long> UNIT_MAP;

static
{
/*
* 支持的单位集合:[B|K|M|G|T]
*/
UNIT_MAP = new HashMap<Character, Long>();
UNIT_MAP.put(UNIT_B, 1L);
UNIT_MAP.put(UNIT_K, 1024L);
UNIT_MAP.put(UNIT_M, UNIT_MAP.get(UNIT_K) * 1024);
UNIT_MAP.put(UNIT_G, UNIT_MAP.get(UNIT_M) * 1024);
UNIT_MAP.put(UNIT_T, UNIT_MAP.get(UNIT_G) * 1024);
}

private long value;

/**
* 通过任意数字来构造
* @param number
*/
public ByteNumber(Number value)
{
if (value == null)
{
return;
}

this.value = value.longValue();
}

/**
* 通过任意字符串来构造
* @param value
*/
public ByteNumber(String valueStr)
{
if (valueStr == null || valueStr.isEmpty())
{
return;
}

valueStr = valueStr.toUpperCase(); // 统一转换为大写

if (valueStr.endsWith("B"))
{
valueStr = valueStr.substring(0, valueStr.length() - 1);
}

if (valueStr.isEmpty())
{
// 判定以B结尾,去除后如果字符串为空,则当0处理

return;
}

Character lastChar = valueStr.charAt(valueStr.length() - 1);
String valuePart = valueStr;
Character unit = UNIT_B; // 默认单位为B

if (UNIT_MAP.containsKey(lastChar))
{
unit = lastChar;
valuePart = valueStr.substring(0, valueStr.length() - 1);
}

if (valuePart.isEmpty())
{
this.value = UNIT_MAP.get(unit);
}

try
{
double doubleValue = Double.parseDouble(valuePart);

this.value = (long)(doubleValue * UNIT_MAP.get(unit)); // 转换成最终数值后将会舍去小数部分
}
catch (NumberFormatException e)
{
}
}

public long getValue()
{
return value;
}

public double getValue(char unit)
{
unit = Character.toUpperCase(unit);
if (!UNIT_MAP.containsKey(unit))
{
throw new IllegalArgumentException("only B,K(B),M(B),G(B),T(B) are supported(case insensitive)!");
}

return this.value * 1.0 / UNIT_MAP.get(unit);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: