import java.text.Collator;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Random;
import java.util.TimeZone;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* <p>字符串处理通用工具类</p>
* 字符串空串处理、随机串生成等.
* @author zz
*/
public final class StringTools
{
// 随机串缺省长度:
private static final int LEN = 6;
// 随机串码表:ASCII_NUMERIC、ASCII_ALPHA(UPPER/LOWER)
private static final char[] ASCII_NUMERIC = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
// 随机对象:
private static final Random RANDOM = new Random();
// Locale 参数顺序
private static final int LANGUAGE = 0;
private static final int COUNTRY = 1;
private static final int VARIANT = 2;
private static final int DEFAULT_LENGTH = 50;
/**
* <默认构造函数>
*/
private StringTools()
{
}
/**
* <p>字符串判空</p>
* 判断一个对象是否为“空串”.
* @param val 要判断的对象.
* @return true “空串”, false 非空或不是字符串.
*/
public static boolean isNullOrNone(Object val)
{
if (null == val)
{
return true;
}
if (val.getClass() == String.class && "".equals(val))
{
return true;
}
return false;
}
/**
* <p>字符串比较</p>
* 比较两个字符串是否相等,都为null时,认为相等.
* @param val1 字符串1
* @param val2 字符串2
* @return true 两字符串相等(或都为null) false 两字符串不相等.
*/
public static boolean isEquals(String val1, String val2)
{
if (null == val1 && null == val2)
{
return true;
}
if (val1 != null && val2 != null)
{
Collator c = Collator.getInstance();
if (c.compare(val1, val2) == 0)
{
return true;
}
}
return false;
}
/**
* <p>获取从页面传递参数信息</p>
* 将页面中传入的对象属性值解析成key:value形式放入map中,供外部使用。适用于struts2
* 页面传入的对象必须覆盖toString()方法,且格式必须为:
* prop:value;prop:value;prop:value
* @param key 参数键值.
* @param map 被搜索的Map结构.
* @return 页面参数Map对象.
*/
public static Map<String, String> getPropMap(String key, Map<String, String[]> map)
{
String[] strArr = map.get(key);
if (isNullOrNone(strArr) || 0 == strArr.length)
{
return new HashMap<String, String>(0);
}
strArr = strArr[0].split(";");
int length = strArr.length;
String tempKey = "";
String tempVal = "";
String[] tempArr = null;
Map<String, String> tempMap = new HashMap<String, String>();
for (int i = 0; i < length; i++)
{
tempArr = strArr[i].split(":");
tempKey = String.valueOf(tempArr[0]).trim();
tempVal = String.valueOf(tempArr[1]).trim();
tempMap.put(tempKey, tempVal);
}
return tempMap;
}
/**
* <p>获取从页面传递参数信息</p>
* 获取从页面传递的String类型的参数信息,适用于struts2
* @param key 键.
* @param map 被搜索的Map结构.
* @return 参数字符串值.
*/
public static String getStringParam(String key, Map<String, String[]> map)
{
String[] strArr = map.get(key);
if (isNullOrNone(strArr) || 0 == strArr.length)
{
return "";
}
return strArr[0];
}
/**
* <p>获取从页面传递参数信息</p>
* 获取从页面传递的String类型的参数信息,适用于struts2
* @param key 键.
* @param map 被搜索的Map结构.
* @return 参数布尔值.
*/
public static boolean getBooleanParam(String key, Map<String, String[]> map)
{
String[] strArr = map.get(key);
if (isNullOrNone(strArr) || 0 == strArr.length)
{
return false;
}
return Boolean.parseBoolean(strArr[0]);
}
/**
* <p>获取从页面传递参数信息</p>
* 获取从页面传递的String类型的参数信息,适用于struts2
* @param key 键.
* @param map 被搜索的Map结构.
* @return 参数整型值.
*
*/
public static int getIntParam(String key, Map<String, String[]> map)
{
String[] strArr = map.get(key);
if (isNullOrNone(strArr) || 0 == strArr.length)
{
return -1;
}
return Integer.parseInt(strArr[0]);
}
/**
* <p>字符串分割</p>
* 将字符串分割成字符串数组, 类似toCharArray方法.
* @param input 被分的字符串.
* @return 分成的字符串数组.
*/
public static String[] toStringArray(String input)
{
if (isNullOrNone(input))
{
return new String[0];
}
int length = input.length();
String[] strArr = new String[length];
for (int i = 0; i < length; i++)
{
strArr[i] = String.valueOf(input.charAt(i));
}
return strArr;
}
/**
* <p>字符串合成</p>
* 将字符串数组转换成字符串.
* @param item 字符串数组.
* @return 合成后的字符串.
*/
public static String arrayToString(String[] item)
{
if (item == null || item.length == 0)
{
return "";
}
StringBuffer msg = new StringBuffer();
for (int i = 0; i < item.length; i++)
{
msg.append(item[i]);
}
return msg.toString();
}
/**
* 获取随机串.
* 获取缺省长度的随机数字串,首字符可以为'0'.
* @author zhangtao(42373)
* @return 缺省长度(6)数字串.
*/
public static String getRandomNum()
{
return getRandomNum(LEN);
}
/**
* 获取随机串.
* 获取指定长度的随机数字串,首字符可以为'0'.
* @author zhangtao(42373)
* @param len 指定字符串中字符个数.
* @return 定长数字串.
*/
public static String getRandomNum(int len)
{
StringBuffer sb = new StringBuffer(len);
int max = ASCII_NUMERIC.length;
for (int i = 0; i < len; i++)
{
sb.append(ASCII_NUMERIC[RANDOM.nextInt(max)]);
}
return sb.toString();
}
/**
* 去掉电话号码中的"<"前内容,">"后内容
* 例如:Tom<13800000020> 返回13800000020
* @author liuqian
* @param uiMobile 显示的电话号码
* @return String 返回没有<>格式的电话号码
*/
public static String getUiMobile(String uiMobile)
{
if (isNullOrNone(uiMobile))
{
return "";
}
int start = uiMobile.indexOf('<');
int end = uiMobile.indexOf('>');
if (start > -1 && end > -1 && end > start)
{
return uiMobile.substring(start + 1, end);
}
return uiMobile;
}
/**
* 是否包含非ASCII字符
* @param msg 待校验的字符串
* @return true 包含, false 不包含
*/
public static boolean isContainUnicode(String msg)
{
for (int i = 0; i < msg.length(); i++)
{
Character c = msg.charAt(i);
Character.UnicodeBlock blk = Character.UnicodeBlock.of(c);
if (blk != Character.UnicodeBlock.BASIC_LATIN)
{
return true;
}
}
return false;
}
/**
* 根据字符串生成Locale
* 根据数据库中表示语言信息的Locale字符串,如zh_CN来生成对应的Locale对象
* @author zhangtao(42373)
* @param locale 表示Locale的字符串,如zh_CN
* @return Locale 对象
* @see java.util.Locale
*/
public static Locale getLocale(String locale)
{
String[] parts = {"", "", ""};
String[] tmp = locale.split("_");
System.arraycopy(tmp, 0, parts, 0, Math.min(tmp.length, parts.length));
return new Locale(parts[LANGUAGE], parts[COUNTRY], parts[VARIANT]);
}
/**
* 处理通用参数是否为数值
* @param parameter 参数
* @return boolean 匹配 true 不匹配 false
*/
public static boolean isNumber(String parameter)
{
if (null == parameter)
{
return false;
}
Pattern p = Pattern.compile("[0-9]+");
Matcher m = p.matcher(parameter);
return m.matches();
}
/**
* 处理通用参数是否为符合规则的字符串
* @param parameter 参数
* @param regex 匹配的字符串规则
* @return true 表示匹配 false 不匹配
*/
public static boolean isValidStringAllow(String parameter, String regex)
{
if (null == parameter || "".equals(parameter))
{
return false;
}
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(parameter);
return m.find();
}
/**
* 由于字符串太长,需要截取一定的长度,默认为50
* @param str 需要被截取的字符串
* @return String [返回类型说明]
* @see [类、类#方法、类#成员]
*/
public static String getStrByDefLength(String str)
{
if (isNullOrNone(str) || str.length() <= DEFAULT_LENGTH)
{
return str;
}
else
{
return str.substring(0, DEFAULT_LENGTH) + "......";
}
}
/**
* 将本地时间格式化为UTC时间
* @param timeFormat 时间格式
* @return newtime 转换后的时间
* @see [类、类#方法、类#成员]
*/
public static String getUTCtime(String timeFormat)
{
Calendar cal = Calendar.getInstance();
SimpleDateFormat sFormat = new SimpleDateFormat(timeFormat);//时间格式:yyyy-MM-dd HH:mm:ss
TimeZone zone = TimeZone.getTimeZone("GMT");
sFormat.setTimeZone(zone);
String newtime = sFormat.format(cal.getTime());
return newtime;
}
}