package com.streamlet.common.util; import java.math.BigDecimal; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Various String utility functions. Most of the functions herein are * re-implementations of the ones in apache commons StringUtils. */ public class StringUtils { public static final String ERROR_TOAST = "网络环境不给力,请检查网络"; public static final String NO_MORE_DATE = "没有更多数据"; public static final String EMPTY = ""; public static final String SUCCESSCODE = "200"; public static final String SUCCESSDESC = "请求成功"; public static final String EMPTYNUM = "0"; public static final String BLANK_SPACE = " "; public static String trim(String text) { if (text == null) return ""; return text.trim(); } /** * @param text * @return * @Description 判断字符串是否为空 * @author Created by qinxianyuzou on 2014-12-11. */ public static boolean isEmpty(String text) { return text == null || text.trim().compareTo("") == 0 || text.equals("null"); } /** * Description: 返回字符串本身,防空指针.<br/><br/> * Author: Create by Yu.Yao on 2016/9/13.<br/><br/> */ public static String removalNull(String defaultString, String text) { if (isEmpty(text)) { return defaultString; } return text; } /** * Checks if a String is whitespace, empty ("") or null.</p> */ public static boolean isBlank(String str) { int strLen; if (str == null || (strLen = str.length()) == 0) { return true; } for (int i = 0; i < strLen; i++) { if ((Character.isWhitespace(str.charAt(i)) == false)) { return false; } } return true; } public static String listToString(List<String> list, String separator) { if (list == null || list.size() == 0) return ""; StringBuilder string = new StringBuilder(); for (int i = 0; i < list.size(); i++) { string.append(list.get(i)); if (i < list.size() - 1) { string.append(separator); } } return string.toString(); } public static String stringArrayToString(String[] array, String separator) { if (array == null || array.length == 0) return ""; StringBuilder string = new StringBuilder(); for (int i = 0; i < array.length; i++) { string.append(array[i]).append(separator); } return string.toString(); } public final static int getIntValue(String str) { if (str != null && str.length() > 0) { try { return Integer.parseInt(str); } catch (Exception e) { } } return 0; } public final static long getLongValue(String str) { if (str != null && str.length() > 0) { try { return Long.parseLong(str); } catch (Exception e) { } } return 0; } public static String removeEmptyChar(String src) { if (src == null || src.length() == 0) return src; return src.replaceAll("[\r]*[\n]*[ ]*[ ]*", ""); } public static String getFileNameFromUrl(String url) { // 名字不能只用这个 // 通过 ‘?’ 和 ‘/’ 判断文件名 String extName = ""; String filename; int index = url.lastIndexOf('?'); if (index > 1) { extName = url.substring(url.lastIndexOf('.') + 1, index); } else { extName = url.substring(url.lastIndexOf('.') + 1); } filename = hashKeyForDisk(url) + "." + extName; return filename; } /** * 一个散列方法,改变一个字符串(如URL)到一个散列适合使用作为一个磁盘文件名。 */ public static String hashKeyForDisk(String key) { String cacheKey; try { final MessageDigest mDigest = MessageDigest.getInstance("MD5"); mDigest.update(key.getBytes()); cacheKey = bytesToHexString(mDigest.digest()); } catch (NoSuchAlgorithmException e) { cacheKey = String.valueOf(key.hashCode()); } return cacheKey; } private static String bytesToHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(0xFF & bytes[i]); if (hex.length() == 1) { sb.append('0'); } sb.append(hex); } return sb.toString(); } public static String Md5(String string) { if (string != null && !string.equals("")) { try { MessageDigest md5 = MessageDigest.getInstance("MD5"); char[] HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; byte[] md5Byte = md5.digest(string.getBytes("UTF8")); StringBuffer sb = new StringBuffer(); for (int i = 0; i < md5Byte.length; i++) { sb.append(HEX[(int) (md5Byte[i] & 0xff) / 16]); sb.append(HEX[(int) (md5Byte[i] & 0xff) % 16]); } string = sb.toString(); } catch (Exception e) { } } return string; } /** * 根据各国的手机号码规则,检测输入 * * @param code * @param number * @return * @time 2011-7-22 上午09:41:04 * @author:linyg */ public static boolean phoneNumberValid(String code, String number) { // 手机号固定在5-20范围内 if (number.length() < 5 || number.length() > 20) { return false; } String match = ""; if ("86".equals(code)) {// 中国 if (number.length() != 11) { return false; } else { match = "^[1]{1}[0-9]{2}[0-9]{8}$"; } } // 正则匹配 if (!"".equals(match)) { return number.matches(match); } return true; } public static boolean phoneNumberValid(String number) { // 手机号固定在5-20范围内 if (number.length() < 5 || number.length() > 20) { return false; } String match = ""; if (number.length() != 11) { return false; } else { // match = "^[1]{1}[0-9]{2}[0-9]{8}$"; // match = "^(13[0-9]|14[5|7]|15[0-9]|17[0-9]|18[0-9])\\d{8}$"; match = "^(1[3456789])\\d{9}$"; } // 正则匹配 if (!"".equals(match)) { return number.matches(match); } return true; } /** * 判断邮箱地址是否有效限 */ public static boolean isEmailAddValid(String address) { if (address != null && address.length() > 0) { char[] cAddress = address.toCharArray(); for (char c : cAddress) { if (c > 127) { return false; } } Pattern p = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"); Matcher m = p.matcher(address); return m.matches(); } return false; } /** * 判断密码是否有效 * <p> * 0 -- 非法;1 -- 正确; 2 -- 不一致 */ public static int isPasswordValid(String password, String repeated) { if (password != null) { int len = password.length(); if (len >= 6 && len <= 16) { char[] cPsw = password.toCharArray(); boolean wrongChar = false; for (char c : cPsw) { if (c >= 128) { // 找到非ascii码 wrongChar = true; break; } } if (!wrongChar) { return password.equals(repeated) ? 1 : 2; } } } return 0; } /** * 过滤掉 \r 换行 \n回车 * * @param str * @return */ public static String replaceBlank(String str) { String dest = ""; if (str != null) { Pattern p = Pattern.compile("\\r+|\n+"); Matcher m = p.matcher(str); dest = m.replaceAll(" ");// .replaceAll(" +", " "); } return dest; } // 半角字符与全角字符混乱所致:这种情况一般就是汉字与数字、英文字母混用,可以避免由于占位导致的排版混乱问题了 public static String ToDBC(String input) { char[] c = input.toCharArray(); for (int i = 0; i < c.length; i++) { if (c[i] == 12288) { c[i] = (char) 32; continue; } if (c[i] > 65280 && c[i] < 65375) c[i] = (char) (c[i] - 65248); } return new String(c); } public static String ListTOString(ArrayList<String> dataList) { if (null == dataList || dataList.size() == 0) { return ""; } StringBuilder str_b = new StringBuilder(); for (String ss : dataList) { str_b.append(ss); str_b.append("$"); } return str_b.substring(0, str_b.length() - 1); } public static <T> boolean isEmptyData(List<T> newData) { if (newData == null) { return true; } else { if (newData.size() == 0) { return true; } else { return false; } } } /** * 方法名称:transMapToString * 传入参数:map * 返回值:String 形如 username'chenziwen^password'1234 */ public static String transMapToString(Map map) { Map.Entry entry; StringBuffer sb = new StringBuffer(); for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext(); ) { entry = (Map.Entry) iterator.next(); sb.append(entry.getKey().toString()).append("'").append(null == entry.getValue() ? "" : entry.getValue().toString()).append(iterator.hasNext() ? "^" : ""); } return sb.toString(); } /** * 方法名称:transStringToMap * 传入参数:mapString 形如 username'chenziwen^password'1234 * 返回值:Map */ public static Map transStringToMap(String mapString) { Map map = new HashMap(); StringTokenizer items; for (StringTokenizer entrys = new StringTokenizer(mapString, "^"); entrys.hasMoreTokens(); map.put(items.nextToken(), items.hasMoreTokens() ? ((Object) (items.nextToken())) : null)) items = new StringTokenizer(entrys.nextToken(), "'"); return map; } /** * 判断字符串是不是全是数字 */ public static boolean isNumeric(String str) { for (int i = str.length(); --i >= 0; ) { if (!Character.isDigit(str.charAt(i))) { return false; } } return true; } /** * 距离格式化 */ public static String formatDistance(float distance) { DecimalFormat df = new DecimalFormat("0.#"); if (distance < 1000) { return df.format(distance) + "m"; } return df.format(distance / 1000) + "km"; } public static String formatDistance(double distance) { DecimalFormat df = new DecimalFormat("0.#"); if (distance < 1000) { return df.format(distance) + "m"; } return df.format(distance / 1000) + "km"; } /* 校验过程: 1、从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。 2、从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,将个位十位数字相加,即将其减去9),再求和。 3、将奇数位总和加上偶数位总和,结果应该可以被10整除。 */ /** * 校验银行卡卡号 */ public static boolean checkBankCard(String bankCard) { if (bankCard.length() < 15 || bankCard.length() > 19) { return false; } char bit = getBankCardCheckCode(bankCard.substring(0, bankCard.length() - 1)); if (bit == 'N') { return false; } return bankCard.charAt(bankCard.length() - 1) == bit; } /** * 从不含校验位的银行卡卡号采用 Luhm 校验算法获得校验位 * * @param nonCheckCodeBankCard * @return */ public static char getBankCardCheckCode(String nonCheckCodeBankCard) { if (nonCheckCodeBankCard == null || nonCheckCodeBankCard.trim().length() == 0 || !nonCheckCodeBankCard.matches("\\d+")) { //如果传的不是数据返回N return 'N'; } char[] chs = nonCheckCodeBankCard.trim().toCharArray(); int luhmSum = 0; for (int i = chs.length - 1, j = 0; i >= 0; i--, j++) { int k = chs[i] - '0'; if (j % 2 == 0) { k *= 2; k = k / 10 + k % 10; } luhmSum += k; } return (luhmSum % 10 == 0) ? '0' : (char) ((10 - luhmSum % 10) + '0'); } /** * 得到一个字符串的长度,显示的长度,一个汉字或日韩文长度为2,英文字符长度为1 * * @param s 需要得到长度的字符串 * @return int 得到的字符串长度 */ public static int getStrLength(String s) { if (s == null) return 0; char[] c = s.toCharArray(); int len = 0; for (int i = 0; i < c.length; i++) { len++; if (!isLetter(c[i])) { len++; } } return len; } public static boolean isLetter(char c) { int k = 0x80; return c / k == 0 ? true : false; } /** * 对字符串进行格式化,最多显示长度为length,超过时,其后的内容使用“...代替” * * @param str * @param length * @return */ public static String regexString(String str, int length) { if (str.length() > length) { return str.substring(0, length - 4) + "..."; } return str; } /** * 对URL进行格式化:构造形式为URL/XXX/XXX * * @param params * @param url * @return */ public static String formatUrl(List<Object> params, String url) { StringBuilder builder = new StringBuilder(); builder.append(url); for (Object param : params) { builder.append("/" + param); } return builder.toString(); } /** 拼接链接完整URL */ public static String generateUrl(String url, Map<String, Object> params) { StringBuilder urlBuilder = new StringBuilder(url); // web接口: url?key=val&key=val&key=val; if (null != params) { urlBuilder.append("?"); Iterator<Map.Entry<String, Object>> iterator = params.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, Object> param = iterator.next(); String key = param.getKey(); Object value = param.getValue(); urlBuilder.append(key).append('=').append(value); if (iterator.hasNext()) { urlBuilder.append('&'); } } } return urlBuilder.toString(); } /** * 用于字符串为null会报错的控件 */ public static String getNoNUllString(String txt) { if (txt == null) return ""; return txt; } /**金额为分的格式 */ public static final String CURRENCY_FEN_REGEX = "\\-?[0-9]+"; /** * 分转为元 * @param fen * @return */ public static String fromFenToYuan(int fen){ if(!String.valueOf(fen).matches(CURRENCY_FEN_REGEX)) { return "金额格式有误"; } String yuan = BigDecimal.valueOf(fen).divide(new BigDecimal(100)).toString(); return yuan; } }