| import java.text.DecimalFormat; import java.util.Hashtable;
 
 /**
 * 文件大小单位转换
 * @author Administrator
 *
 */
 public class UnitsConversion extends DecimalFormat {
 
 private static final long serialVersionUID = 3168068393840262910L;
 /**
 * 存放有效单位的数组
 */
 private static Hashtable<String, String> validUnits = new Hashtable<String, String>();
 /**
 * 限制文件大小上限为1G
 */
 private static int GB_MAX_SIZE = 1;
 /**
 * 最大的MB值
 */
 private static int MB_MAX_SIZE = GB_MAX_SIZE * 1024;
 /**
 * 最大的KB值
 */
 private static int KB_MAX_SIZE = MB_MAX_SIZE * 1024;
 /**
 * 最大的Bytes值
 */
 private static int BYTES_MAX_SIZE = KB_MAX_SIZE * 1024;
 /**
 * 数字部分的值
 */
 private Double numPart;
 /**
 * 原始的单位字符串
 */
 private String originalUnit;
 /**
 * 标准的单位字符串
 */
 private String unit;
 /**
 * 转换后的结果
 */
 private String result;
 
 // 添加所有有效单位
 static {
 validUnits.put("字节", "Bytes");
 validUnits.put("bytes", "Bytes");
 validUnits.put("byte", "Bytes");
 validUnits.put("kb", "KB");
 validUnits.put("k", "KB");
 validUnits.put("兆", "MB");
 validUnits.put("mb", "MB");
 validUnits.put("m", "MB");
 validUnits.put("gb", "GB");
 validUnits.put("g", "GB");
 }
 
 /**
 * 构造方法:指定了数字格式,初始所有属性为NULL
 */
 public UnitsConversion() {
 super("########.##");
 numPart = null;
 result = null;
 unit = null;
 originalUnit = null;
 }
 
 /**
 * 根据单位、数字大小按照常用的转换原则进行转换
 *
 * @param input
 * @return 成功转换后的结果是非空字符串;若失败了,结果为空字符串
 */
 public String defaultConversion(String input) {
 analyzeString(input);
 if (result != null) {
 return result;
 }
 // 单位 Bytes
 if (unit.equals("Bytes")) {
 int numPart2Int = numPart.intValue();
 // 输入大小与1G相差0.5M之内,返回1GB
 if ((BYTES_MAX_SIZE - numPart2Int) < (1024 * 1024) / 2) {
 return "1 GB";
 }
 // (0,1KB)
 if (numPart2Int < 1024) {
 return numPart2Int + " Bytes";
 }
 // [1KB,1023KB]
 if (numPart2Int >= 1024 && numPart2Int <= (1024 - 1) * 1024) {
 return format(numPart / 1024) + " KB";
 }
 // (1023KB,1GB)
 if (numPart2Int > (1024 - 1) * 1024 && numPart2Int < BYTES_MAX_SIZE) {
 return format(numPart / (1024 * 1024)) + " MB";
 } else
 result = "";
 return result;
 }
 
 if (unit.equals("KB")) {
 return "还没实现....";
 }
 
 if (unit.equals("MB")) {
 return "还没实现....";
 }
 
 if (unit.equals("GB")) {
 return "还没实现....";
 }
 result = "";
 return result;
 }
 
 /** * 把字符串的数字部分与单位分离,并对数字、单位的有效性进行检验, 若有非法状况,把结果赋值为 "" ,将其返回给用户 * * @param input
 */
 public void analyzeString(String input) {
 // 初步检验输入的字符串
 if (input == null || input.trim().length() < 2) {
 System.out.println("输入的字符串有误");
 result = "";
 return;
 }
 input = input.replaceAll(" ", "");
 int firstIndexOfUnit;// 单位的起始位置
 String strOfNum;// 数字部分的字符串
 // 从尾部开始遍历字符串
 for (int i = input.length() - 1; i >= 0; i--) {
 if (Character.isDigit(input.charAt(i))) {
 firstIndexOfUnit = i + 1;
 originalUnit = input.substring(firstIndexOfUnit,
 input.length()).toLowerCase();
 if (!isValidUnit(originalUnit)) {
 System.out.println("无效单位。");
 result = "";
 return;
 }
 unit = validUnits.get(originalUnit);
 strOfNum = input.substring(0, firstIndexOfUnit);
 numPart = Double.parseDouble(strOfNum);
 if (!isValidNum(numPart, unit)) {
 System.out.println("文件大小非法");
 result = "";
 return;
 }
 if (numPart == 0) {
 result = "0 Bytes";
 return;
 }
 break;
 }
 }
 if (unit == null || numPart == null) {
 System.out.println("输入的字符串有误");
 result = "";
 return;
 }
 
 }
 
 /**
 * 文件大小越界检查
 *
 * @param num
 * @param unit
 * @return 在1G范围内(包括1G),返回true;否则返回false
 */
 public boolean isValidNum(Double num, String unit) {
 if (num == null || num < 0 || num > BYTES_MAX_SIZE) {
 return false;
 }
 if (unit.equals("KB") && num > KB_MAX_SIZE) {
 return false;
 }
 if (unit.equals("MB") && num > MB_MAX_SIZE) {
 return false;
 }
 if (unit.equals("GB") && num > GB_MAX_SIZE) {
 return false;
 }
 return true;
 }
 
 /**
 * 检查原始单位originalUnit是否有效
 *
 * @param originalUnit
 * @return 若originalUnit为空,那么会给他赋默认值 bytes ,并返回true;
 
 *         若originalUnit是有效单位集合中之一,返回true。
 */
 public boolean isValidUnit(String originalUnit) {
 if (originalUnit == null || originalUnit.trim().length() < 1) {
 originalUnit = "bytes";
 return true;
 }
 for (String validUnit : validUnits.keySet()) {
 if (validUnit.equalsIgnoreCase(originalUnit)) {
 return true;
 }
 }
 return false;
 }
 //测试
 public static void main(String[] args) {
 System.out.println("-------------");
 for (int i = 1020 * 1024; i <= 1024 * 1111; i += 9) {
 String input = i + " ";
 System.out.println(input + " ---> "
 + new UnitsConversion().defaultConversion(input));
 }
 }
 
 }
 
 |