/*
* Copyright (C) 2012 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package org.springside.modules.utils.number;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 将带单位的时间,大小字符串转换为数字.
*
* from Facebook
* https://github.com/facebook/jcommon/blob/master/config/src/main/java/com/facebook/config/ConfigUtil.java
*
* @author calvin
*
*/
public class UnitConverter {
private static final Pattern NUMBER_AND_UNIT = Pattern.compile("(\\d+)([a-zA-Z]+)?");
/**
* 将带单位的时间字符串转化为毫秒数.
*
* 单位包括不分大小写的ms(毫秒),s(秒),m(分钟),h(小时),d(日),y(年)
*
* 不带任何单位的话,默认单位是毫秒
*/
public static long convertDurationMillis(String duration) {
Matcher matcher = NUMBER_AND_UNIT.matcher(duration);
if (matcher.matches()) {
long number = Long.parseLong(matcher.group(1));
if (matcher.group(2) != null) {
String unitStr = matcher.group(2).toLowerCase();
char unit = unitStr.charAt(0);
switch (unit) {
case 's':
return number * 1000;
case 'm':
// if it's an m, could be 'minutes' or 'millis'. default minutes
if (unitStr.length() >= 2 && unitStr.charAt(1) == 's') {
return number;
}
return number * 60 * 1000;
case 'h':
return number * 60 * 60 * 1000;
case 'd':
return number * 60 * 60 * 24 * 1000;
default:
throw new IllegalArgumentException("unknown time unit :" + unit);
}
} else {
return number;
}
} else {
throw new IllegalArgumentException("malformed duration string: " + duration);
}
}
/**
* 将带单位的大小字符串转化为字节数.
*
* 单位包括不分大小写的b(b),k(kb),m(mb),g(gb),t(tb)
*
* 不带任何单位的话,默认单位是b
*/
public static long convertSizeBytes(String size) {
Matcher matcher = NUMBER_AND_UNIT.matcher(size);
if (matcher.matches()) {
long number = Long.parseLong(matcher.group(1));
if (matcher.group(2) != null) {
char unit = matcher.group(2).toLowerCase().charAt(0);
switch (unit) {
case 'b':
return number;
case 'k':
return number * 1024;
case 'm':
return number * 1024 * 1024;
case 'g':
return number * 1024 * 1024 * 1024;
case 't':
return number * 1024 * 1024 * 1024 * 1024;
default:
throw new IllegalArgumentException("unknown size unit :" + unit);
}
} else {
return number;
}
} else {
throw new IllegalArgumentException("malformed size string: " + size);
}
}
}