package com.doumee.lib_coremodel.util; import android.text.TextUtils; import org.json.JSONException; import org.json.JSONObject; import java.security.NoSuchAlgorithmException; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.Set; import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.crypto.Cipher; import javax.crypto.Mac; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; /** * 字符串操作工具包 */ public class StringUtil { public final static String EMPTY=""; private final static Pattern emailer = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"); private final static Pattern identityCard = Pattern.compile("(\\d{14}[0-9xX])|(\\d{17}[0-9xX])"); private final static Pattern passer = Pattern.compile("[A-Za-z0-9@._-]{6,20}"); private final static Pattern pureNumber = Pattern.compile("[0-9]{8,30}"); private final static Pattern phoner = Pattern.compile("1[0-9]{10}"); private final static Pattern bankCarder = Pattern.compile("[0-9]{16}|[0-9]{19}"); private final static Pattern user = Pattern.compile("[A-Za-z0-9@._-]{6,20}"); private final static Pattern Age = Pattern.compile("[0-9]*"); private final static Pattern Chinese = Pattern.compile("^[\u4e00-\u9fa5]*$"); private final static Pattern English = Pattern.compile("^[A-Za-z]+$"); private final static Pattern LinkMan = Pattern.compile("^([A-Za-z]+)$|^([\u4e00-\u9fa5]{2,4})$"); private final static Pattern LoanAmt = Pattern.compile("\\d{1,10}"); private final static Pattern LoanExpiry = Pattern.compile("^\\d{1,2}$"); private final static Pattern BizLicense = Pattern.compile("(?!^[a-zA-Z]+$)[0-9a-zA-Z]+"); private final static Pattern LoanMoney = Pattern.compile("^(\\d{1,10})(\\.\\d{1,2})?$"); private final static Pattern HouseSize = Pattern.compile("^(\\d{1,4})(\\.\\d{1,2})?$"); private final static Pattern ZonuleName = Pattern.compile("[A-Za-z0-9\u4e00-\u9fa5]+"); private final static Pattern Color = Pattern.compile("[A-Za-z\u4e00-\u9fa5]+"); private final static Pattern PaiLiang = Pattern.compile("^(\\d{1,2})(\\.\\d{1,2})?$"); private final static Pattern CarMileage = Pattern.compile("^(\\d{1,8})(\\.\\d{1,2})?$"); private final static Pattern Money = Pattern.compile("^(\\d{1,8})(\\.\\d{1,2})?$"); /** * 判断给定字符串是否空白串。 * 空白串是指由空格、制表符、回车符、换行符组成的字符串 * 若输入字符串为null或空字符串,返回true * * @param input * @return boolean */ public static boolean isEmpty(String input) { if (input == null || "".equals(input)) { return true; } for (int i = 0; i < input.length(); i++) { char c = input.charAt(i); if (c != ' ' && c != '\t' && c != '\r' && c != '\n') { return false; } } return true; } /** * 判断是不是一个合法的身份证号 * * @param card * @return */ public static boolean isIdentityCard(String card) { if (card == null || "".equals(card)) return false; return identityCard.matcher(card).matches(); } /** * 判断是不是一个合法的电子邮件地址 * * @param email * @return */ public static boolean isEmail(String email) { if (TextUtils.isEmpty(email)) return false; return emailer.matcher(email).matches(); } /** * 判断是不是一个合法的用户密码 * * @return */ public static boolean isPassword(String password) { if (TextUtils.isEmpty(password)) return false; return passer.matcher(password).matches(); } /** * 判断是不是一个合法的用户名 * * @param custName * @return true为合法的用户名 */ public static boolean isUser(String custName) { if (custName == null || "".equals(custName)) { return false; } return user.matcher(custName).matches(); } public static boolean ispureNumber(String custName) { return pureNumber.matcher(custName).matches(); } /** * 判断是不是一个合法的年龄 * * @param age * @return */ public static boolean isAge(String age) { return Age.matcher(age).matches(); } /** * 这个方法只支持最大长度为32的随机字符串,如要支持更大长度的,可以适当修改此方法,如前面补、后面补,或者多个uuid相连接 * @param length * @return */ public static String toFixedLengthStringByUUID(int length) { //也可以通过UUID来随机生成 UUID uuid = UUID.randomUUID(); return uuid.toString().replace("-", "").substring(0, length); } /** * 判断是不是一个合法的手机号码 */ public static boolean isPhone(String phone) { if (TextUtils.isEmpty(phone)) return false; return phoner.matcher(phone).matches(); } /** * 判断是不是一个合法的银行卡号 * * @return */ public static boolean isBankCard(String cardNum) { if (cardNum == null || "".equals(cardNum)) return false; return bankCarder.matcher(cardNum).matches(); } /** * 数字类型的金额格式化成字符串 */ public static String toMoney(Double obj) { if (obj == null) { return "0.00"; } DecimalFormat df = new DecimalFormat("#,#0.00"); return df.format(obj); } /** * 数字格式化,保留两位小数 * * @param obj * @return */ public static String douFormat(double obj) { DecimalFormat df = new DecimalFormat("0.00"); return df.format(obj); } /** * 获取输入的字符长度,汉字为两个字符 * * @param value * @return */ public static int stringLength(String value) { int valueLength = 0; String chinese = "[\u4e00-\u9fa5]"; for (int i = 0; i < value.length(); i++) { String temp = value.substring(i, i + 1); if (temp.matches(chinese)) { valueLength += 2; } else { valueLength += 1; } } return valueLength; } /** * 将字符串转化为double类型 * * @param value * @return */ public static double StringToDouble(String value) { try { if (value == null || "".equals(value)) return 0.00; return Double.parseDouble(value); }catch (NumberFormatException e){ return 0; } } /** * 字符串转整数 * * @param str * @return */ public static int StringToInt(String str) { try { return Integer.parseInt(str); } catch (Exception e) { } return 0; } /** * 字符串转long * * @param str * @return */ public static long StringToLong(String str) { try { return Long.parseLong(str); } catch (Exception e) { } return 0; } /** * 判断字符串是否是中文字符 * * @return boolean false 字符串含有其他非中文字符 true 字符串都是中文字符串 */ public static boolean isChinese(String str) { if (null == str || "".equals(str.trim())) { return false; } for (int i = 0; i < str.length(); i++) { if (!isChinese(str.charAt(i))) { return false; } } return true; } /** * 判断字符是否是中文字符 * * @return boolean false 字符不是中文字符 true 字符是中文字符 */ public static boolean isChinese(char c) { int v = (int) c; return (v >= 19968 && v < 171941); } /** * 中文汉字 * * @param str * @return */ public static boolean isC(String str) { if (null == str || "".equals(str.trim())) { return false; } return Chinese.matcher(str).matches(); } /** * 英文 * * @param str * @return */ public static boolean isEnglish(String str) { if (null == str || "".equals(str.trim())) { return false; } return English.matcher(str).matches(); } /** * 金额 * * @param str * @return */ public static boolean isMoney(String str) { if (null == str || "".equals(str.trim())) { return false; } return Money.matcher(str).matches(); } /** * 判断名字是否含有英文特殊字符(功能应未完善,应该包含中文特殊字符) * * @return boolean false 名字不合法,含有英文特殊字符 true 名字合法 ,不含有英文特殊字符 */ public static boolean isNameLegal(String str) { String temp = "@_\\_|_~_`_!_#_$_%_^_&_*_(_)_{_}_[_]_;_:_'_\"_,_<_._>_/_?_-_¥_!_ @_#_¥_%_&_*_(_)_——_+_?_~_·_;_:|、_{_}_【_】_1_2_3_4_5_6_7_8_9_0_“_”_…_、_:_《_》_℃_€_£_=_÷_,_。"; String[] strs = temp.split("_"); for (int i = 0; i < strs.length; i++) { if (str.contains(strs[i])) { return false; } } return true; } /** * 判断是否符合联系人格式 * * @param str * @return */ public static boolean isLinkMan(String str) { if (null == str || "".equals(str.trim())) { return false; } return LinkMan.matcher(str).matches(); } /** * 融资金额 * * @param str * @return */ public static boolean isLoanAmt(String str) { if (TextUtils.isEmpty(str)) { return false; } return LoanAmt.matcher(str).matches(); } /** * 贷款期限 * * @param str * @return */ public static boolean isLoanExpiry(String str) { if (null == str || "".equals(str.trim())) { return false; } return LoanExpiry.matcher(str).matches(); } /** * 营业执照 * * @param str * @return */ public static boolean isBizLicense(String str) { if (null == str || "".equals(str.trim())) { return false; } return BizLicense.matcher(str).matches(); } /** * 资金 * * @param str * @return */ public static boolean isLoanMoney(String str) { if (null == str || "".equals(str.trim())) { return false; } return LoanMoney.matcher(str).matches(); } /** * 房屋面积 * * @param str * @return */ public static boolean isHouseSize(String str) { if (null == str || "".equals(str.trim())) { return false; } return HouseSize.matcher(str).matches(); } public static String cutOffCardNum(String id) { if (id.length() == 18) { return new StringBuilder().append(id.substring(0, 3)).append("****").append(id.substring(14, 18)).toString(); } else if (id.length() == 15) { return new StringBuilder().append(id.substring(0, 3)).append("****").append(id.substring(11, 15)).toString(); } else { return id; } } public static String cutOffPhone(String phone) { if (isPhone(phone)) { return new StringBuilder().append(phone.substring(0, 3)).append("****").append(phone.substring(8, 11)).toString(); } else { return phone; } } /** * 小区名称 * * @param str * @return */ public static boolean isZonuleName(String str) { if (null == str || "".equals(str.trim())) { return false; } return ZonuleName.matcher(str).matches(); } /** * 排量 * * @param str * @return */ public static boolean isPaiLiang(String str) { if (null == str || "".equals(str.trim())) { return false; } return PaiLiang.matcher(str).matches(); } /** * 汽车颜色 * * @param str * @return */ public static boolean isColor(String str) { if (null == str || "".equals(str.trim())) { return false; } return Color.matcher(str).matches(); } /** * 汽车里程 * * @param str * @return */ public static boolean isCarMileage(String str) { if (null == str || "".equals(str.trim())) { return false; } return CarMileage.matcher(str).matches(); } public static String replaceEach(final String text, final String[] searchList, final String[] replacementList) { return replaceEach(text, searchList, replacementList, false, 0); } public static String dateFormat(String date){ if(TextUtils.isEmpty(date)){ return ""; } return date.substring(0,4)+"-"+date.substring(4,6)+"-"+date.substring(6,8)+" "+date.substring(8,10)+":"+date.substring(10,12)+":"+date.substring(12); } public static String simpleDateFormat(String date){ if(date==null){ return ""; } return date.substring(0,4)+"-"+date.substring(4,6)+"-"+date.substring(6,8); } public static String timeToString(long time){ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String d = format.format(new Date(time)); return d; } /** *

* Replaces all occurrences of Strings within another String. *

*

*

* A {@code null} reference passed to this method is a no-op, or if * any "search string" or "string to replace" is null, that replace will be * ignored. *

*

*

     *  StringUtils.replaceEachRepeatedly(null, *, *) = null
     *  StringUtils.replaceEachRepeatedly("", *, *) = ""
     *  StringUtils.replaceEachRepeatedly("aba", null, null) = "aba"
     *  StringUtils.replaceEachRepeatedly("aba", new String[0], null) = "aba"
     *  StringUtils.replaceEachRepeatedly("aba", null, new String[0]) = "aba"
     *  StringUtils.replaceEachRepeatedly("aba", new String[]{"a"}, null) = "aba"
     *  StringUtils.replaceEachRepeatedly("aba", new String[]{"a"}, new String[]{""}) = "b"
     *  StringUtils.replaceEachRepeatedly("aba", new String[]{null}, new String[]{"a"}) = "aba"
     *  StringUtils.replaceEachRepeatedly("abcde", new String[]{"ab", "d"}, new String[]{"w", "t"}) = "wcte"
     *  (example of how it repeats)
     *  StringUtils.replaceEachRepeatedly("abcde", new String[]{"ab", "d"}, new String[]{"d", "t"}) = "tcte"
     *  StringUtils.replaceEachRepeatedly("abcde", new String[]{"ab", "d"}, new String[]{"d", "ab"}) = IllegalStateException
     * 
* * @param text text to search and replace in, no-op if null * @param searchList the Strings to search for, no-op if null * @param replacementList the Strings to replace them with, no-op if null * @return the text with any replacements processed, {@code null} if * null String input * @throws IllegalStateException if the search is repeating and there is an endless loop due * to outputs of one being inputs to another * @throws IllegalArgumentException if the lengths of the arrays are not the same (null is ok, * and/or size 0) * @since 2.4 */ public static String replaceEach( final String text, final String[] searchList, final String[] replacementList, final boolean repeat, final int timeToLive) { // mchyzer Performance note: This creates very few new objects (one major goal) // let me know if there are performance requests, we can create a harness to measure if (text == null || text.isEmpty() || searchList == null || searchList.length == 0 || replacementList == null || replacementList.length == 0) { return text; } // if recursing, this shouldn't be less than 0 if (timeToLive < 0) { throw new IllegalStateException("Aborting to protect against StackOverflowError - " + "output of one loop is the input of another"); } final int searchLength = searchList.length; final int replacementLength = replacementList.length; // make sure lengths are ok, these need to be equal if (searchLength != replacementLength) { throw new IllegalArgumentException("Search and Replace array lengths don't match: " + searchLength + " vs " + replacementLength); } // keep track of which still have matches final boolean[] noMoreMatchesForReplIndex = new boolean[searchLength]; // index on index that the match was found int textIndex = -1; int replaceIndex = -1; int tempIndex = -1; // index of replace array that will replace the search string found // NOTE: logic duplicated below START for (int i = 0; i < searchLength; i++) { if (noMoreMatchesForReplIndex[i] || searchList[i] == null || searchList[i].isEmpty() || replacementList[i] == null) { continue; } tempIndex = text.indexOf(searchList[i]); // see if we need to keep searching for this if (tempIndex == -1) { noMoreMatchesForReplIndex[i] = true; } else { if (textIndex == -1 || tempIndex < textIndex) { textIndex = tempIndex; replaceIndex = i; } } } // NOTE: logic mostly below END // no search strings found, we are done if (textIndex == -1) { return text; } int start = 0; // get a good guess on the size of the result buffer so it doesn't have to double if it goes over a bit int increase = 0; // count the replacement text elements that are larger than their corresponding text being replaced for (int i = 0; i < searchList.length; i++) { if (searchList[i] == null || replacementList[i] == null) { continue; } final int greater = replacementList[i].length() - searchList[i].length(); if (greater > 0) { increase += 3 * greater; // assume 3 matches } } // have upper-bound at 20% increase, then let Java take over increase = Math.min(increase, text.length() / 5); final StringBuilder buf = new StringBuilder(text.length() + increase); while (textIndex != -1) { for (int i = start; i < textIndex; i++) { buf.append(text.charAt(i)); } buf.append(replacementList[replaceIndex]); start = textIndex + searchList[replaceIndex].length(); textIndex = -1; replaceIndex = -1; tempIndex = -1; // find the next earliest match // NOTE: logic mostly duplicated above START for (int i = 0; i < searchLength; i++) { if (noMoreMatchesForReplIndex[i] || searchList[i] == null || searchList[i].isEmpty() || replacementList[i] == null) { continue; } tempIndex = text.indexOf(searchList[i], start); // see if we need to keep searching for this if (tempIndex == -1) { noMoreMatchesForReplIndex[i] = true; } else { if (textIndex == -1 || tempIndex < textIndex) { textIndex = tempIndex; replaceIndex = i; } } } // NOTE: logic duplicated above END } final int textLength = text.length(); for (int i = start; i < textLength; i++) { buf.append(text.charAt(i)); } final String result = buf.toString(); if (!repeat) { return result; } return replaceEach(result, searchList, replacementList, repeat, timeToLive - 1); } /** * 半角转全角 * @param input String. * @return 全角字符串. */ public static String toSBC(String input) { char c[] = input.toCharArray(); for (int i = 0; i < c.length; i++) { if(c[i] == ' ') { c[i] = '\u3000'; }else if(c[i] < '\177') { c[i] = (char) (c[i] + 65248); } } return new String(c); } public static String hashToStr(HashMap map){ JSONObject clientKey = new JSONObject(); // 将map中的key-value关系存入到set集合中,再使用Map.Entry Set entrySet = map.entrySet(); // key-value的set集合 Iterator it2 = entrySet.iterator(); while(it2.hasNext()){ Map.Entry me = (Map.Entry) it2.next(); Object k = me.getKey(); Object v = me.getValue(); try { clientKey.put((String)k,v); } catch (JSONException e) { e.printStackTrace(); } } return String.valueOf(clientKey); } /** * 秒转为分钟小时 * @return *//* public static String sToMH(int s) { int h=0; int m=0; StringBuilder builder=new StringBuilder(); if(s/3600>0){ h=s/3600; builder.append(h+MApplication.mContext.getResources().getString(R.string.time_h)); s-=3600*h; } if(s/60>0){ m=s/60; builder.append(m+MApplication.mContext.getResources().getString(R.string.time_m)); s-=m*60; }else { if(h!=0){ builder.append(0+MApplication.mContext.getResources().getString(R.string.time_m)); } } builder.append(s+ MApplication.mContext.getResources().getString(R.string.time_s)); return builder.toString(); }*/ /** * 影藏手机中间4位 * @return */ public static String phoneToHind(String s) { if(s==null){ return ""; } if(s.length()==11){ s=s.substring(0,3)+"****"+s.substring(7); } return s; } /** * 影藏银行卡号码,保留后4位 * @return */ public static String bankNumToHind(String s) { if(s==null){ return ""; } if(s.length()>4){ int size=s.length(); String s1=s.substring(size-4); StringBuffer buffer=new StringBuffer(); for(int i=0;i