StringHelper

StringHelper

   1 /**
   2  * <html>
   3  * <body>
   4  *  <P> Copyright 1994 JsonInternational</p>
   5  *  <p> All rights reserved.</p>
   6  *  <p> Created on 19941115</p>
   7  *  <p> Created by Jason</p>
   8  *  </body>
   9  * </html>
  10  */
  11 package cn.ucaner.alpaca.framework.utils.string;
  12 
  13 import java.io.UnsupportedEncodingException;
  14 import java.net.URLEncoder;
  15 import java.text.DecimalFormat;
  16 import java.text.SimpleDateFormat;
  17 import java.util.ArrayList;
  18 import java.util.Collection;
  19 import java.util.Date;
  20 import java.util.HashMap;
  21 import java.util.Iterator;
  22 import java.util.LinkedHashSet;
  23 import java.util.List;
  24 import java.util.Map;
  25 import java.util.Map.Entry;
  26 import java.util.Random;
  27 import java.util.Set;
  28 import java.util.StringTokenizer;
  29 
  30 import org.apache.commons.lang3.StringUtils;
  31 import org.apache.commons.logging.Log;
  32 import org.apache.commons.logging.LogFactory;
  33 
  34 /**
  35 * @Package:cn.ucaner.framework.utils   
  36 * @ClassName:StringHelper   
  37 * @Description:   <p>---字符串工具类---</p>
  38 * @Author: - Jason 
  39 * @CreatTime:2017年8月30日 下午2:06:53   
  40 * @Modify By:   
  41 * @ModifyTime:  
  42 * @Modify marker:   
  43 * @version    V1.0
  44  */
  45 public class StringHelper {
  46 
  47     public static Log logger = LogFactory.getLog(StringHelper.class);
  48 
  49     /**
  50      * 前导标识
  51      */
  52     public static final int BEFORE = 1;
  53 
  54     /**
  55      * 后继标识
  56      */
  57     public static final int AFTER = 2;
  58 
  59     public static final String DEFAULT_PATH_SEPARATOR = ",";
  60 
  61     /**
  62      * 将一个中间带逗号分隔符的字符串转换为ArrayList对象
  63      * 
  64      * @param str
  65      *            待转换的符串对象
  66      * @return ArrayList对象
  67      */
  68     public static ArrayList<?> strToArrayList(String str) {
  69         return strToArrayListManager(str, DEFAULT_PATH_SEPARATOR);
  70     }
  71 
  72     /**
  73      * 将字符串对象按给定的分隔符separator转象为ArrayList对象
  74      * 
  75      * @param str
  76      *            待转换的字符串对象
  77      * @param separator
  78      *            字符型分隔符
  79      * @return ArrayList对象
  80      */
  81     public static ArrayList<String> strToArrayList(String str, String separator) {
  82         return strToArrayListManager(str, separator);
  83     }
  84 
  85     /**
  86      * @Description: 分割
  87      * @param str
  88      * @param separator
  89      * @return ArrayList<String>
  90      * @Autor: jasonandy@hotmail.com
  91      */
  92     private static ArrayList<String> strToArrayListManager(String str, String separator) {
  93 
  94         StringTokenizer strTokens = new StringTokenizer(str, separator);
  95         ArrayList<String> list = new ArrayList<String>();
  96 
  97         while (strTokens.hasMoreTokens()) {
  98             list.add(strTokens.nextToken().trim());
  99         }
 100 
 101         return list;
 102     }
 103 
 104     /**
 105      * 将一个中间带逗号分隔符的字符串转换为字符型数组对象
 106      * 
 107      * @param str
 108      *            待转换的符串对象
 109      * @return 字符型数组
 110      */
 111     public static String[] strToStrArray(String str) {
 112         return strToStrArrayManager(str, DEFAULT_PATH_SEPARATOR);
 113     }
 114 
 115     /**
 116      * 将字符串对象按给定的分隔符separator转象为字符型数组对象
 117      * 
 118      * @param str  待转换的符串对象
 119      * @param separator 字符型分隔符
 120      * @return 字符型数组
 121      */
 122     public static String[] strToStrArray(String str, String separator) {
 123         return strToStrArrayManager(str, separator);
 124     }
 125 
 126     private static String[] strToStrArrayManager(String str, String separator) {
 127 
 128         StringTokenizer strTokens = new StringTokenizer(str, separator);
 129         String[] strArray = new String[strTokens.countTokens()];
 130         int i = 0;
 131 
 132         while (strTokens.hasMoreTokens()) {
 133             strArray[i] = strTokens.nextToken().trim();
 134             i++;
 135         }
 136 
 137         return strArray;
 138     }
 139 
 140     public static Set<String> strToSet(String str) {
 141         return strToSet(str, DEFAULT_PATH_SEPARATOR);
 142     }
 143 
 144     public static Set<String> strToSet(String str, String separator) {
 145         String[] values = strToStrArray(str, separator);
 146         Set<String> result = new LinkedHashSet<String>();
 147         for (int i = 0; i < values.length; i++) {
 148             result.add(values[i]);
 149         }
 150         return result;
 151     }
 152 
 153     /**
 154      * 将一个数组,用逗号分隔变为一个字符串
 155      * @param array
 156      * @return modify by yuce reason:user StringBuffer replace "+"
 157      */
 158     public static String ArrayToStr(Object[] array) {
 159         if (array == null || array.length < 0) {
 160             return null;
 161         }
 162         StringBuffer sb = new StringBuffer();
 163         for (Object obj : array) {
 164             if (StringUtils.isNotBlank(obj.toString())) {
 165                 if (sb.length() > 0) {
 166                     sb.append(DEFAULT_PATH_SEPARATOR);
 167                 }
 168                 sb.append(obj.toString());
 169             }
 170         }
 171         return sb.toString();
 172     }
 173 
 174     public static String CollectionToStr(Collection<String> coll) {
 175         StringBuffer sb = new StringBuffer();
 176         int i = 0;
 177         for (String string : coll) {
 178             if (i > 0) {
 179                 sb.append(",");
 180             }
 181             i++;
 182             sb.append(string);
 183         }
 184         return sb.toString();
 185     }
 186 
 187     /**
 188      * 转换给定字符串的编码格式
 189      * @param inputString  待转换字符串对象
 190      * @param inencoding 待转换字符串的编码格式
 191      * @param outencoding  准备转换为的编码格式
 192      * @return 指定编码与字符串的字符串对象
 193      */
 194     public static String encodingTransfer(String inputString, String inencoding, String outencoding) {
 195         if (inputString == null || inputString.length() == 0) {
 196             return inputString;
 197         }
 198         try {
 199             return new String(inputString.getBytes(outencoding), inencoding);
 200         } catch (Exception e) {
 201             return inputString;
 202         }
 203     }
 204 
 205     /**
 206      * 删除字符串中指定的字符 只要在delStrs参数中出现的字符,并且在inputString中也出现都会将其它删除
 207      * @param inputString 待做删除处理的字符串
 208      * @param delStrs  作为删除字符的参照数据,用逗号分隔。如果要删除逗号可以在这个字符串再加一个逗号
 209      * @return 返回一个以inputString为基础不在delStrs出现新字符串
 210      */
 211     public static String delString(String inputString, String delStrs) {
 212         if (inputString == null || inputString.length() == 0) {
 213             return inputString;
 214         }
 215         String[] strs = strToStrArray(delStrs);
 216         for (int i = 0; i < strs.length; i++) {
 217             if ("".equals(strs[i])) {
 218                 inputString = inputString.replaceAll(" ", "");
 219             } else {
 220                 if (strs[i].compareTo("a") >= 0) {
 221                     inputString = replace(inputString, strs[i], "");
 222                 } else {
 223                     inputString = inputString.replaceAll("\\" + strs[i], "");
 224                 }
 225             }
 226         }
 227         if (subCount(delStrs, ",") > strs.length) {
 228             inputString = inputString.replaceAll("\\,", "");
 229         }
 230         return inputString;
 231     }
 232 
 233     /**
 234      * 去除左边多余的空格。
 235      * @param value  待去左边空格的字符串
 236      * @return 去掉左边空格后的字符串
 237      */
 238     public static String trimLeft(String value) {
 239         String result = value;
 240         if (result == null) {
 241             return result;
 242         }
 243         char[] ch = result.toCharArray();
 244         int index = -1;
 245         for (int i = 0; i < ch.length; i++) {
 246             if (Character.isWhitespace(ch[i])) {
 247                 index = i;
 248             } else {
 249                 break;
 250             }
 251         }
 252         if (index != -1) {
 253             result = result.substring(index + 1);
 254         }
 255         return result;
 256     }
 257 
 258     /**
 259      * 去除右边多余的空格。
 260      * @param value 待去右边空格的字符串
 261      * @return 去掉右边空格后的字符串
 262      */
 263     public static String trimRight(String value) {
 264         String result = value;
 265         if (result == null) {
 266             return result;
 267         }
 268         char[] ch = result.toCharArray();
 269         int endIndex = -1;
 270         for (int i = ch.length - 1; i > -1; i--) {
 271             if (Character.isWhitespace(ch[i])) {
 272                 endIndex = i;
 273             } else {
 274                 break;
 275             }
 276         }
 277         if (endIndex != -1) {
 278             result = result.substring(0, endIndex);
 279         }
 280         return result;
 281     }
 282 
 283     /**
 284      * 判断一个字符串中是否包含另一个字符串
 285      * @param parentStr  父串
 286      * @param subStr  子串
 287      * @return 如果父串包含子串的内容返回真,否则返回假
 288      */
 289     public static boolean isInclude(String parentStr, String subStr) {
 290         return parentStr.indexOf(subStr) >= 0;
 291     }
 292 
 293     /**
 294      * 判断一个字符串中是否包含另一个字符串数组的任何一个
 295      * @param parentStr    父串
 296      * @param subStrs  子串集合(以逗号分隔的字符串)
 297      * @return 如果父串包含子串的内容返回真,否则返回假
 298      */
 299     public static boolean isIncludes(String parentStr, String subStrs) {
 300         String[] subStrArray = strToStrArray(subStrs);
 301         for (int j = 0; j < subStrArray.length; j++) {
 302             String subStr = subStrArray[j];
 303             if (isInclude(parentStr, subStr)) {
 304                 return true;
 305             } else {
 306                 continue;
 307             }
 308         }
 309         return false;
 310     }
 311 
 312     /**
 313      * 判断一个子字符串在父串中重复出现的次数
 314      * @param parentStr 父串
 315      * @param subStr  子串
 316      * @return 子字符串在父字符串中重得出现的次数
 317      */
 318     public static int subCount(String parentStr, String subStr) {
 319         int count = 0;
 320 
 321         for (int i = 0; i < ( parentStr.length() - subStr.length() ); i++) {
 322             String tempString = parentStr.substring(i, i + subStr.length());
 323             if (subStr.equals(tempString)) {
 324                 count++;
 325             }
 326         }
 327         return count;
 328     }
 329 
 330     /**
 331      * 得到在字符串中从开始字符串到结止字符串中间的子串
 332      * @param parentStr 父串
 333      * @param startStr 开始串
 334      * @param endStr 结止串
 335      * @return 返回开始串与结止串之间的子串
 336      */
 337     public static String subString(String parentStr, String startStr, String endStr) {
 338         return parentStr.substring(parentStr.indexOf(startStr) + startStr.length(), parentStr.indexOf(endStr));
 339     }
 340 
 341     /**
 342      * 得到在字符串中从开始字符串到结止字符串中间的子串的集合
 343      * @param parentStr  父串
 344      * @param startStr 开始串
 345      * @param endStr 结止串
 346      * @return 返回开始串与结止串之间的子串的集合
 347      */
 348     public static List<String> subStringList(String parentStr, String startStr, String endStr) {
 349         List<String> result = new ArrayList<String>();
 350         List<String> elements = dividToList(parentStr, startStr, endStr);
 351         for (String element : elements) {
 352             if (!isIncludes(element, startStr) || !isIncludes(element, endStr)) {
 353                 continue;
 354             }
 355             result.add(subString(element, startStr, endStr));
 356         }
 357         return result;
 358 
 359     }
 360 
 361     /**
 362      * 将指定的String转换为Unicode的等价值
 363      * 基础知识: 所有的转义字符都是由 '\' 打头的第二个字符 0-9 :八进制 u :是Unicode转意,长度固定为6位 Other:则为以下字母中的一个 b,t,n,f,r,",\ 都不满足,则产生一个编译错误
 364      * 提供八进制也是为了和C语言兼容. b,t,n,f,r 则是为控制字符.书上的意思为:描述数据流的发送者希望那些信息如何被格式化或者被表示. 它可以写在代码的任意位置,只要转义后是合法的. 例如: int c=0\u003b
 365      * 上面的代码可以编译通过,等同于int c=0; \u003b也就是';'的Unicode代码
 366      * 
 367      * @param str 待转换为Unicode的等价字符串
 368      * @return Unicode的字符串
 369      */
 370     public static String getUnicodeStr(String inStr) {
 371         char[] myBuffer = inStr.toCharArray();
 372         StringBuffer sb = new StringBuffer();
 373 
 374         for (int i = 0; i < inStr.length(); i++) {
 375             byte b = (byte) myBuffer[i];
 376             short s = (short) myBuffer[i];
 377             String hexB = Integer.toHexString(b);
 378             String hexS = Integer.toHexString(s);
 379             /*
 380              * //输出为大写 String hexB = Integer.toHexString(b).toUpperCase(); String hexS =
 381              * Integer.toHexString(s).toUpperCase(); //print char sb.append("char["); sb.append(i); sb.append("]='");
 382              * sb.append(myBuffer[i]); sb.append("'\t");
 383              * 
 384              * //byte value sb.append("byte="); sb.append(b); sb.append(" \\u"); sb.append(hexB); sb.append('\t');
 385              */
 386 
 387             // short value
 388             sb.append(" \\u");
 389             sb.append(fillStr(hexS, "0", 4, AFTER));
 390             // sb.append('\t');
 391             // Unicode Block
 392             // sb.append(Character.UnicodeBlock.of(myBuffer[i]));
 393         }
 394 
 395         return sb.toString();
 396 
 397     }
 398 
 399     /**
 400      * 判断一个字符串是否是合法的Java标识符
 401      * @param s 待判断的字符串
 402      * @return 如果参数s是一个合法的Java标识符返回真,否则返回假
 403      */
 404     public static boolean isJavaIdentifier(String s) {
 405         if (s.length() == 0 || Character.isJavaIdentifierStart(s.charAt(0))) {
 406             return false;
 407         }
 408         for (int i = 0; i < s.length(); i++)
 409             if (!Character.isJavaIdentifierPart(s.charAt(i))) {
 410                 return false;
 411             }
 412         return true;
 413     }
 414 
 415     /**
 416      * 替换字符串中满足条件的字符 例如: replaceAll("\com\hi\platform\base\\util",'\\','/'); 返回的结果为: /com/hi/platform/base/util
 417      * @param str 待替换的字符串
 418      * @param oldchar   待替换的字符
 419      * @param newchar 替换为的字符
 420      * @return 将str中的所有oldchar字符全部替换为newchar,并返回这个替换后的字符串
 421      */
 422     public static String replaceAll(String str, char oldchar, char newchar) {
 423         char[] chars = str.toCharArray();
 424         for (int i = 0; i < chars.length; i++) {
 425             if (chars[i] == oldchar) {
 426                 chars[i] = newchar;
 427             }
 428         }
 429         return new String(chars);
 430     }
 431 
 432     /**
 433      * 如果inStr字符串与没有给定length的长度,则用fill填充,在指定direction的方向 如果inStr字符串长度大于length就直截返回inStr,不做处理
 434      * 
 435      * @param inStr
 436      *            待处理的字符串
 437      * @param fill
 438      *            以该字符串作为填充字符串
 439      * @param length
 440      *            填充后要求的长度
 441      * @param direction
 442      *            填充方向,如果是AFTER填充在后面,否则填充在前面
 443      * @return 返回一个指定长度填充后的字符串
 444      */
 445     public static String fillStr(String inStr, String fill, int length, int direction) {
 446         if (inStr == null || inStr.length() > length || inStr.length() == 0) {
 447             return inStr;
 448         }
 449         StringBuffer tempStr = new StringBuffer("");
 450         for (int i = 0; i < length - inStr.length(); i++) {
 451             tempStr.append(fill);
 452         }
 453 
 454         if (direction == AFTER) {
 455             return new String(tempStr.toString() + inStr);
 456         } else {
 457             return new String(inStr + tempStr.toString());
 458         }
 459     }
 460 
 461     /**
 462      * 字符串替换
 463      * 
 464      * @param str
 465      *            源字符串
 466      * @param pattern
 467      *            待替换的字符串
 468      * @param replace
 469      *            替换为的字符串
 470      * @return
 471      */
 472     public static String replace(String str, String pattern, String replace) {
 473         int s = 0;
 474         int e = 0;
 475         StringBuffer result = new StringBuffer();
 476         while ( ( e = str.indexOf(pattern, s) ) >= 0) {
 477             result.append(str.substring(s, e));
 478             result.append(replace);
 479             s = e + pattern.length();
 480         }
 481         result.append(str.substring(s));
 482 
 483         return result.toString();
 484     }
 485 
 486     /**
 487      * 分隔字符串到一个集合
 488      * 
 489      * @param str
 490      * @param start
 491      * @param end
 492      * @return
 493      */
 494     public static List<String> dividToList(String str, String start, String end) {
 495         if (str == null || str.length() == 0) {
 496             return null;
 497         }
 498         int s = 0;
 499         int e = 0;
 500         List<String> result = new ArrayList<String>();
 501         if (isInclude(str, start) && isInclude(str, end)) {
 502             while ( ( e = str.indexOf(start, s) ) >= 0) {
 503                 result.add(str.substring(s, e));
 504                 s = str.indexOf(end, e) + end.length();
 505                 result.add(str.substring(e, s));
 506             }
 507             if (s < str.length()) {
 508                 result.add(str.substring(s));
 509             }
 510             if (s == 0) {
 511                 result.add(str);
 512             }
 513         } else {
 514             result.add(str);
 515         }
 516         return result;
 517     }
 518 
 519     /**
 520      * 首字母大写
 521      * 
 522      * @param string
 523      * @return
 524      */
 525     public static String upperFrist(String string) {
 526         if (string == null) {
 527             return null;
 528         }
 529         String upper = string.toUpperCase();
 530         return upper.substring(0, 1) + string.substring(1);
 531     }
 532 
 533     /**
 534      * 首字母小写
 535      * 
 536      * @param string
 537      * @return
 538      */
 539     public static String lowerFrist(String string) {
 540         if (string == null) {
 541             return null;
 542         }
 543         String lower = string.toLowerCase();
 544         return lower.substring(0, 1) + string.substring(1);
 545     }
 546 
 547     public static String URLEncode(String string, String encode) {
 548         try {
 549             return URLEncoder.encode(string, encode);
 550         } catch (UnsupportedEncodingException e) {
 551             e.printStackTrace();
 552             return null;
 553         }
 554     }
 555 
 556     /**
 557      * 将一个日期类型的对象,转换为指定格式的字符串
 558      * 
 559      * @param date
 560      *            待转换的日期
 561      * @param format
 562      *            转换为字符串的相应格式 例如:DateToStr(new Date() ,"yyyy.MM.dd G 'at' hh:mm:ss a zzz");
 563      * @return 一个字符串
 564      *         <p>
 565      * 
 566      *         <table border="0" cellspacing="3" cellpadding="0">
 567      *         <tr bgcolor="#ccccff">
 568      *         <th align="left">Letter
 569      *         <th align="left">Date or Time Component
 570      *         <th align="left">Presentation
 571      *         <th align="left">Examples
 572      *         <tr>
 573      *         <td><code>G</code>
 574      *         <td>Era designator
 575      *         <td><a href="#text">Text</a>
 576      *         <td><code>AD</code>
 577      *         <tr bgcolor="#eeeeff">
 578      *         <td>Year
 579      *         <td><a href="#year">Year</a>
 580      *         <td><code>1996</code>; <code>96</code>
 581      *         <tr>
 582      *         <td><code>M</code>
 583      *         <td>Month in year
 584      *         <td><a href="#month">Month</a>
 585      *         <td><code>July</code>; <code>Jul</code>; <code>07</code>
 586      *         <tr bgcolor="#eeeeff">
 587      *         <td><code>w</code>
 588      *         <td>Week in year
 589      *         <td><a href="#number">Number</a>
 590      *         <td><code>27</code>
 591      *         <tr>
 592      *         <td><code>W</code>
 593      *         <td>Week in month
 594      *         <td><a href="#number">Number</a>
 595      *         <td><code>2</code>
 596      *         <tr bgcolor="#eeeeff">
 597      *         <td><code>D</code>
 598      *         <td>Day in year
 599      *         <td><a href="#number">Number</a>
 600      *         <td><code>189</code>
 601      *         <tr>
 602      *         <td><code>d</code>
 603      *         <td>Day in month
 604      *         <td><a href="#number">Number</a>
 605      *         <td><code>10</code>
 606      *         <tr bgcolor="#eeeeff">
 607      *         <td><code>F</code>
 608      *         <td>Day of week in month
 609      *         <td><a href="#number">Number</a>
 610      *         <td><code>2</code>
 611      *         <tr>
 612      *         <td><code>E</code>
 613      *         <td>Day in week
 614      *         <td><a href="#text">Text</a>
 615      *         <td><code>Tuesday</code>; <code>Tue</code>
 616      *         <tr bgcolor="#eeeeff">
 617      *         <td><code>a</code>
 618      *         <td>Am/pm marker
 619      *         <td><a href="#text">Text</a>
 620      *         <td><code>PM</code>
 621      *         <tr>
 622      *         <td><code>H</code>
 623      *         <td>Hour in day (0-23)
 624      *         <td><a href="#number">Number</a>
 625      *         <td><code>0</code>
 626      *         <tr bgcolor="#eeeeff">
 627      *         <td><code>k</code>
 628      *         <td>Hour in day (1-24)
 629      *         <td><a href="#number">Number</a>
 630      *         <td><code>24</code>
 631      *         <tr>
 632      *         <td><code>K</code>
 633      *         <td>Hour in am/pm (0-11)
 634      *         <td><a href="#number">Number</a>
 635      *         <td><code>0</code>
 636      *         <tr bgcolor="#eeeeff">
 637      *         <td><code>h</code>
 638      *         <td>Hour in am/pm (1-12)
 639      *         <td><a href="#number">Number</a>
 640      *         <td><code>12</code>
 641      *         <tr>
 642      *         <td><code>m</code>
 643      *         <td>Minute in hour
 644      *         <td><a href="#number">Number</a>
 645      *         <td><code>30</code>
 646      *         <tr bgcolor="#eeeeff">
 647      *         <td><code>s</code>
 648      *         <td>Second in minute
 649      *         <td><a href="#number">Number</a>
 650      *         <td><code>55</code>
 651      *         <tr>
 652      *         <td><code>S</code>
 653      *         <td>Millisecond
 654      *         <td><a href="#number">Number</a>
 655      *         <td><code>978</code>
 656      *         <tr bgcolor="#eeeeff">
 657      *         <td><code>z</code>
 658      *         <td>Time zone
 659      *         <td><a href="#timezone">General time zone</a>
 660      *         <td><code>Pacific Standard Time</code>; <code>PST</code>; <code>GMT-08:00</code>
 661      *         <tr>
 662      *         <td><code>Z</code>
 663      *         <td>Time zone
 664      *         <td><a href="#rfc822timezone">RFC 822 time zone</a>
 665      *         <td><code>-0800</code>
 666      *         </table>
 667      */
 668     public static String DateToStr(Date date, String format) {
 669         SimpleDateFormat formatter = new SimpleDateFormat(format);
 670         return formatter.format(date);
 671     }
 672 
 673     /**
 674      * 对给定的字符串做html转义
 675      * 
 676      * @param string
 677      * @return
 678      */
 679     public static String escapeHtml(String string) {
 680         if (string == null || string.length() == 0) {
 681             return "";
 682         }
 683 
 684         char b;
 685         char c = 0;
 686         int i;
 687         int len = string.length();
 688         StringBuffer sb = new StringBuffer(len + 4);
 689         String t;
 690 
 691         for (i = 0; i < len; i += 1) {
 692             b = c;
 693             c = string.charAt(i);
 694             switch (c) {
 695             case '\\':
 696             case '"':
 697                 sb.append('\\');
 698                 sb.append(c);
 699                 break;
 700             case '/':
 701                 if (b == '<') {
 702                     sb.append('\\');
 703                 }
 704                 sb.append(c);
 705                 break;
 706             case '\b':
 707                 sb.append("\\b");
 708                 break;
 709             case '\t':
 710                 sb.append("\\t");
 711                 break;
 712             case '\n':
 713                 sb.append("\\n");
 714                 break;
 715             case '\f':
 716                 sb.append("\\f");
 717                 break;
 718             case '\r':
 719                 sb.append("\\r");
 720                 break;
 721             default:
 722                 if (c < ' ' || ( c >= '\u0080' && c < '\u00a0' ) || ( c >= '\u2000' && c < '\u2100' )) {
 723                     t = "000" + Integer.toHexString(c);
 724                     sb.append("\\u" + t.substring(t.length() - 4));
 725                 } else {
 726                     sb.append(c);
 727                 }
 728             }
 729         }
 730 
 731         return sb.toString();
 732     }
 733 
 734     /**
 735      * 生成一个指定长度的随机字符串
 736      * 
 737      * @param length
 738      *            返回的字符串长度
 739      * @return 返回一个随机
 740      */
 741     public static String randomString(int length) {
 742         if (length < 1) {
 743             return null;
 744         }
 745         Random randGen = new Random();
 746         char[] numbersAndLetters = ( "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ).toCharArray();
 747         char[] randBuffer = new char[length];
 748         for (int i = 0; i < randBuffer.length; i++) {
 749             randBuffer[i] = numbersAndLetters[randGen.nextInt(51)];
 750         }
 751         return new String(randBuffer);
 752     }
 753 
 754     public final static String trim(String target) {
 755         if (target == null)
 756             return null;
 757 
 758         target = target.trim();
 759 
 760         return "".equals(target) ? null : target;
 761     }
 762 
 763     /**
 764      * string to int
 765      * 
 766      * @param numStr
 767      * @return
 768      */
 769     public static int strToInt(String numStr) {
 770         try {
 771             if (isNullOrBlank(numStr)) {
 772                 return 0;
 773             }
 774             return Integer.valueOf(numStr);
 775         } catch (Exception e) {
 776             logger.error("str2int failed:", e);
 777         }
 778         return 0;
 779     }
 780 
 781     /**
 782      * 判断null 或 空字符串
 783      * 
 784      * @param str
 785      * @return
 786      */
 787     public static boolean isNullOrBlank(String str) {
 788         if (str == null) {
 789             return true;
 790         }
 791         str = str.trim();
 792         if (!str.equals("")) {
 793             return false;
 794         } else {
 795             return true;
 796         }
 797     }
 798 
 799     /**
 800      * 判断 空字符串
 801      * 
 802      * @param value
 803      * @return
 804      */
 805     public static boolean isBlank(String value) {
 806         boolean ret = false;
 807         if ( ( value != null ) && ( value.equals("") )) {
 808             ret = true;
 809         }
 810         return ret;
 811     }
 812 
 813     /**
 814      * 判断null
 815      */
 816     public static boolean isNull(Object value) {
 817         return ( value == null );
 818     }
 819 
 820     /**
 821      * Title : 获取随机数
 822      * 
 823      * @author : 聂水根
 824      * @param digits
 825      *            随机数取值范围 默认为0123456789
 826      * @param length
 827      *            随机数位数 默认为1位
 828      * @return
 829      */
 830     public static String getRandom(String digits, int length) {
 831         if (null == digits) {
 832             digits = "0123456789";
 833         }
 834         if (length <= 0) {
 835             length = 1;
 836         }
 837         char[] code = new char[length];
 838         String temp = "";
 839         for (int i = 0; i < length; i++) {
 840             code[i] = digits.charAt((int) ( Math.random() * digits.length() ));
 841             temp += "0";
 842         }
 843         String verifyCode = new String(code);
 844 
 845         if (verifyCode.equals(temp)) {
 846             verifyCode = getRandom(digits, length);
 847         }
 848         return verifyCode;
 849     }
 850 
 851     /**
 852      * Title : 获取范围在min到max间的随机数
 853      * 
 854      * @author : 聂水根
 855      * @param min
 856      * @param max
 857      * @return
 858      */
 859     public static int getRandom(int min, int max) {
 860         return (int) ( Math.random() * ( max - min ) + min );
 861     }
 862 
 863     /**
 864      * Title : 获取范围在min到max间的num个随机数
 865      * 
 866      * @author : 聂水根
 867      * @param min
 868      * @param max
 869      * @return
 870      */
 871     public static Integer[] getRandomNum(int min, int max, int num) {
 872         Integer[] result = new Integer[num];
 873         for (int i = 0; i < num; i++) {
 874             result[i] = getRandom(min, max);
 875         }
 876 
 877         for (int i = 0; i < num; i++) {
 878             for (int k = i + 1; k < num; k++) {
 879                 if (result[i] == result[k]) {
 880                     getRandomNum(min, max, num);
 881                 }
 882             }
 883         }
 884         return result;
 885     }
 886 
 887     public static String ifBlank(String... ss) {
 888         String ret = "";
 889         for (String s : ss) {
 890             if (org.apache.commons.lang3.StringUtils.isNotBlank(s)) {
 891                 ret = s;
 892                 break;
 893             }
 894         }
 895         return ret;
 896     }
 897 
 898     public static String getUrlParamters(String url, String prefix) {
 899         String _return = null;
 900         if (url.indexOf("?") >= 0) {
 901             url = url.substring(url.indexOf("?") + 1);
 902             String[] paramters = url.split("&");
 903             if (paramters != null) {
 904                 for (String s : paramters) {
 905                     if (s.startsWith(prefix)) {
 906                         String[] _temp = s.split("=");
 907                         if (_temp.length > 1) {
 908                             _return = _temp[1];
 909                         }
 910                     }
 911                 }
 912             }
 913         }
 914         return _return;
 915 
 916     }
 917 
 918     /**
 919      * 字符串转换成Long型数字
 920      * 
 921      * @param src
 922      * @return
 923      * 
 924      */
 925     public static long toLong(String src) {
 926         long dest = 0;
 927         if (src == null || src.trim().equals("")) {
 928             return 0;
 929         }
 930 
 931         try {
 932             dest = Long.parseLong(src.trim());
 933         } catch (Exception e) {
 934         }
 935         return dest;
 936     }
 937 
 938     /**
 939      * 创建*Info类型的字符串,一般用于信息查询类接口的返回。
 940      * 
 941      * 例如,调用buildInfoString("#",aaa,bbb,null,ddd); 得到字符串:aaa#bbb##ddd
 942      * 
 943      * @param delimiter
 944      * @param items
 945      * @return
 946      */
 947     public static String buildInfoString(String delimiter, Object... items) {
 948         StringBuffer buff = new StringBuffer();
 949         boolean firstItem = true;
 950         for (Object item : items) {
 951             if (firstItem) {
 952                 firstItem = false;
 953             } else {
 954                 buff.append(delimiter);
 955             }
 956 
 957             if (item == null) {
 958                 buff.append("");
 959             } else {
 960                 buff.append(item.toString());
 961             }
 962 
 963         }
 964 
 965         return buff.toString();
 966     }
 967 
 968     public static long yuan2Cent(String src) {
 969         if (src == null || src.trim().equals("")) {
 970             return 0;
 971         }
 972 
 973         long ret = 0;
 974         try {
 975             ret = (long) ( Math.round(Double.parseDouble(src) * 100) );
 976         } catch (Exception e) {
 977         }
 978 
 979         return ret;
 980     }
 981 
 982     /**
 983      * 把分转换为元
 984      * 
 985      * @param src
 986      * @param floor
 987      *            是否取整
 988      * @return
 989      */
 990     public static String cent2Yuan(String src, boolean floor) {
 991 
 992         long temp = 0;
 993         try {
 994             String tem = src.trim();
 995             temp = Long.parseLong(tem);
 996         } catch (Exception e) {
 997         }
 998         return cent2Yuan(temp, floor);
 999     }
1000 
1001     public static String cent2Yuan(long src, boolean floor) {
1002         DecimalFormat SDF_YUAN = new DecimalFormat("0.00");
1003         String yuan = "0.00";
1004         try {
1005             yuan = SDF_YUAN.format(src / 100.00);
1006         } catch (Exception e) {
1007         }
1008 
1009         if (floor) {
1010             int idxDot = yuan.indexOf(".");
1011             if (idxDot >= 0) {
1012                 yuan = yuan.substring(0, idxDot);
1013             }
1014         }
1015         return yuan;
1016 
1017     }
1018 
1019     public static String cent2Yuan(Double src, boolean floor) {
1020         DecimalFormat SDF_YUAN = new DecimalFormat("0.00");
1021         String yuan = "0.00";
1022         try {
1023             yuan = SDF_YUAN.format(src / 100.00);
1024         } catch (Exception e) {
1025         }
1026 
1027         if (floor) {
1028             int idxDot = yuan.indexOf(".");
1029             if (idxDot >= 0) {
1030                 yuan = yuan.substring(0, idxDot);
1031             }
1032         }
1033         return yuan;
1034 
1035     }
1036 
1037     /**
1038      * 
1039      * 将一个字符串按分隔符分成多个子串。 此方法用于代替Jdk的String.split()方法,不同的地方:<br>
1040      * (1)在此方法中,空字符串不管在哪个位置都视为一个有效字串。 <br>
1041      * (2)在此方法中,分隔符参数不是一个正则表达式。<br>
1042      * 
1043      * @param src
1044      *            源字符串
1045      * @param delimiter
1046      *            分隔符
1047      * @return 字符串数组。
1048      */
1049     public static String[] split(String src, String delimiter) {
1050         if (src == null || delimiter == null || src.trim().equals("") || delimiter.equals("")) {
1051             return new String[] { src };
1052         }
1053 
1054         ArrayList<String> list = new ArrayList<String>();
1055 
1056         int lengthOfDelimiter = delimiter.length();
1057         int pos = 0;
1058         while (true) {
1059             if (pos < src.length()) {
1060 
1061                 int indexOfDelimiter = src.indexOf(delimiter, pos);
1062                 if (indexOfDelimiter < 0) {
1063                     list.add(src.substring(pos));
1064                     break;
1065                 } else {
1066                     list.add(src.substring(pos, indexOfDelimiter));
1067                     pos = indexOfDelimiter + lengthOfDelimiter;
1068                 }
1069             } else if (pos == src.length()) {
1070                 list.add("");
1071                 break;
1072             } else {
1073                 break;
1074             }
1075         }
1076 
1077         String[] result = new String[list.size()];
1078         list.toArray(result);
1079         return result;
1080 
1081     }
1082 
1083     /**
1084      * 若原对象为Null则返回空字符串,否则先转为String类型,再剪去字符串两端的空格及控制字符
1085      * 
1086      * @param src
1087      * @return
1088      */
1089     public static String trim(Object src) {
1090         if (src == null) {
1091             return "";
1092         }
1093 
1094         String str = src.toString();
1095         return str.trim();
1096     }
1097 
1098     /**
1099      * 将一个形如key1=value1&key2=value2...的字符串转换成Map映射。
1100      * 
1101      * @param src
1102      * @return
1103      * 
1104      */
1105     public static Map<String, String> string2Map(String src) {
1106         return string2Map(src, String.class, String.class, "&", "=");
1107     }
1108 
1109     /**
1110      * 将一个形如key1=value1&key2=value2...的字符串转换成Map映射。 注意:key和value只支持类型为String,Long,Integer,Float,Double!
1111      * 
1112      * @param <K>
1113      * @param <V>
1114      * @param src
1115      *            源字符串
1116      * @param keyClass
1117      *            生成的Map的Key的类型,默认String
1118      * @param valueClass
1119      *            生成的Map的Value的类型,默认String
1120      * @param fieldDelimiter
1121      *            字段与字段之间的分隔符,默认&
1122      * @param keyValueDelimiter
1123      *            key和value之间的分隔符,默认=
1124      * @return
1125      * 
1126      */
1127     public static <K extends Object, V extends Object> Map<K, V> string2Map(String src, Class<K> keyClass, Class<V> valueClass,
1128             String fieldDelimiter, String keyValueDelimiter) {
1129         Map<K, V> result = new HashMap<K, V>();
1130 
1131         if (src == null || src.trim().equals("")) {
1132             return result;
1133         }
1134 
1135         String[] fields = StringHelper.split(src, fieldDelimiter);
1136         for (int i = 0; i < fields.length; i++) {
1137             String[] keyValue = StringHelper.split(fields[i], keyValueDelimiter);
1138             String key = keyValue[0];
1139             String value = keyValue[1];
1140 
1141             K objKey = null;
1142             V objValue = null;
1143 
1144             if (keyClass == String.class) {
1145                 objKey = (K) key;
1146             } else if (keyClass == Integer.class) {
1147                 objKey = (K) Integer.valueOf(key);
1148             } else if (keyClass == Long.class) {
1149                 objKey = (K) Long.valueOf(key);
1150             } else if (keyClass == Float.class) {
1151                 objKey = (K) Float.valueOf(key);
1152             } else if (keyClass == Double.class) {
1153                 objKey = (K) Double.valueOf(key);
1154             } else {
1155                 return null;
1156             }
1157 
1158             if (valueClass == String.class) {
1159                 objValue = (V) value;
1160             } else if (valueClass == Integer.class) {
1161                 objValue = (V) Integer.valueOf(value);
1162             } else if (valueClass == Long.class) {
1163                 objValue = (V) Long.valueOf(value);
1164             } else if (valueClass == Float.class) {
1165                 objValue = (V) Float.valueOf(value);
1166             } else if (valueClass == Double.class) {
1167                 objValue = (V) Double.valueOf(value);
1168             } else {
1169                 return null;
1170             }
1171 
1172             result.put(objKey, objValue);
1173 
1174         }
1175 
1176         return result;
1177     }
1178 
1179     /**
1180      * Map转换成字符串,主要用于打印调试信息
1181      * 
1182      * @param map
1183      * @return
1184      */
1185     public static String map2String(Map map) {
1186         return map2String(map, "", "", "", true, "=");
1187     }
1188 
1189     /**
1190      * Map转换成字符串,主要用于打印调试信息
1191      * 
1192      * @param map
1193      * @param head
1194      *            输出的头
1195      * @param entryPrefix
1196      *            每一项输出的前缀
1197      * @param foot
1198      *            输出的脚
1199      * @param isOneItemPl
1200      *            是否每行一项
1201      * @param kvSep
1202      *            Key和Value的分隔符
1203      * @return
1204      */
1205     public static String map2String(Map map, String head, String entryPrefix, String foot, boolean isOneItemPl, String kvSep) {
1206 
1207         if (map == null) {
1208             return null;
1209         }
1210         String lineSeparator = (String) System.getProperty("line.separator");
1211         StringBuffer buff = new StringBuffer();
1212         if (head != null && !head.equals("")) {
1213             buff.append(head);
1214 
1215             if (isOneItemPl) {
1216                 buff.append(lineSeparator);
1217             }
1218         }
1219         if (entryPrefix == null) {
1220             entryPrefix = "";
1221         }
1222         for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) {
1223             Entry entry = (Entry) iterator.next();
1224             buff.append(entryPrefix).append(entry.getKey()).append(kvSep).append(StringHelper.ArrayToStr((Object[]) entry.getValue()));
1225 
1226             if (isOneItemPl) {
1227                 buff.append(lineSeparator);
1228             }
1229         }
1230 
1231         if (foot != null && !foot.equals("")) {
1232             buff.append(foot);
1233             if (isOneItemPl) {
1234                 buff.append(lineSeparator);
1235             }
1236         }
1237         return buff.toString();
1238     }
1239 
1240     /**
1241      * 填充数字0
1242      * 
1243      * @param src
1244      * @param targetLength
1245      * @return
1246      */
1247     public static String fill(long src, int targetLength) {
1248         return fill(String.valueOf(src), "0", targetLength, true);
1249     }
1250 
1251     /**
1252      * 填充字符串。如果原字符串比目标长度长,则截去多出的部分。如果onTheLeft等于true 截去左边部分,否则截去右边部分。 注意填充物一般为单个字符,如果是多个字符,可能导致最后的结果不可用。
1253      * 
1254      * @param src
1255      *            原字符串
1256      * @param padding
1257      *            填充物,一般是0、空格等
1258      * @param targetLength
1259      *            目标长度
1260      * @param onTheLeft
1261      *            是否左填充。
1262      * @return
1263      */
1264     public static String fill(String src, String padding, int targetLength, boolean onTheLeft) {
1265 
1266         if (src == null) {
1267             src = "";
1268         }
1269 
1270         while (src.length() < targetLength) {
1271             if (onTheLeft) {
1272                 src = padding + src;
1273             } else {
1274                 src = src + padding;
1275             }
1276         }
1277 
1278         if (src.length() > targetLength) {
1279             if (onTheLeft) {
1280                 src = src.substring(src.length() - targetLength);
1281             } else {
1282                 src = src.substring(0, targetLength);
1283             }
1284         }
1285 
1286         return src;
1287     }
1288 
1289     public static String changeListToString(List<String> source, String delimiter) {
1290         StringBuilder builder = new StringBuilder();
1291         if (source != null && source.size() > 0) {
1292             int len = source.size();
1293             for (int i = 0; i < len; i++) {
1294                 builder.append(source.get(i));
1295                 if (i < len - 1) {
1296                     builder.append(delimiter);
1297                 }
1298 
1299             }
1300         }
1301         return builder.toString();
1302     }
1303 
1304     public static String changeListToStringWithTag(List<String> source, String delimiter, String tag) {
1305         StringBuilder builder = new StringBuilder();
1306         if (source != null && source.size() > 0) {
1307             int len = source.size();
1308             for (int i = 0; i < len; i++) {
1309                 builder.append(tag + source.get(i) + tag);
1310                 if (i < len - 1) {
1311                     builder.append(delimiter);
1312                 }
1313 
1314             }
1315         }
1316         return builder.toString();
1317     }
1318 
1319     /**
1320      * 是否存在null、或者空字符串。任意一个参数满足条件,返回true;否则返回false。<br>
1321      * 先将参数对象转成字符串,修剪后进行判断。仅包含空格或ASCII控制字符也视为条件满足。<br>
1322      * 
1323      * Noe:Null Or Empty<br>
1324      * 
1325      * @param strings
1326      * @return
1327      */
1328     public static boolean existNoe(Object... someObj) {
1329         if (someObj == null || someObj.length == 0) {
1330             throw new RuntimeException("参数不能为空,必须有至少一个对象");
1331         }
1332 
1333         for (int i = 0; i < someObj.length; i++) {
1334             Object obj = someObj[i];
1335             if (obj == null || obj.toString().trim().equals("")) {
1336                 return true;
1337             }
1338         }
1339 
1340         return false;
1341 
1342     }
1343 
1344     /**
1345      * 若原字符串为Null则返回空字符串。
1346      * 
1347      * @param src
1348      * @return
1349      */
1350     public static String null2Empty(String src) {
1351         if (src == null) {
1352             return "";
1353         }
1354         return src;
1355     }
1356 
1357     /**
1358      * 若原字符串为Null则返回空字符串。
1359      * 
1360      * @param src
1361      * @return
1362      */
1363     public static boolean isEmpty(String src) {
1364         String value = null2Empty(src);
1365         if ("".equals(value)) {
1366             return true;
1367         } else {
1368             return false;
1369         }
1370     }
1371 
1372     /**
1373      * 是否全部非空
1374      * 
1375      * @param src
1376      * @return
1377      */
1378     public static boolean isAllNotEmpty(String... src) {
1379         for (int i = 0; i < src.length; i++) {
1380             String value = src[i];
1381             if (value == null || value.equals("")) {
1382                 return false;
1383             }
1384         }
1385 
1386         return true;
1387     }
1388 
1389     /**
1390      * 是否全部为空
1391      * 
1392      * @param src
1393      * @return
1394      */
1395     public static boolean isAllEmpty(String... src) {
1396         for (int i = 0; i < src.length; i++) {
1397             String value = src[i];
1398             if (value != null && !value.equals("")) {
1399                 return false;
1400             }
1401         }
1402 
1403         return true;
1404     }
1405 
1406     /**
1407      * 是否全为字母或数字
1408      * 
1409      * @param src
1410      * @return
1411      */
1412     public static boolean isLetterOrNumber(String src) {
1413         if (src == null) {
1414             return false;
1415         }
1416 
1417         try {
1418             byte[] bytesOfSrc = src.getBytes("utf-8");
1419 
1420             for (int i = 0; i < bytesOfSrc.length; i++) {
1421                 byte one = bytesOfSrc[i];
1422                 if (one < '0' || ( one > '9' && one < 'A' ) || ( one > 'Z' && one < 'a' ) || one > 'z') {
1423                     return false;
1424                 }
1425             }
1426 
1427         } catch (Exception e) {
1428             return false;
1429         }
1430 
1431         return true;
1432     }
1433 
1434     public static String privacyInfo(String currString) {
1435 
1436         String targetString = "";
1437         if (!StringHelper.isBlank(currString)) {
1438             if (currString.length() <= 3) {
1439                 targetString = currString.replace(org.apache.commons.lang3.StringUtils.substring(currString, 0, 1), "*");
1440             } else if (currString.length() > 3) {
1441                 targetString = currString.replace(org.apache.commons.lang3.StringUtils.substring(currString, 0, 2), "*");
1442             }
1443         }
1444 
1445         return targetString;
1446     }
1447 
1448     /**
1449      * 比较两个字符串是否相等
1450      * 
1451      * @param one
1452      * @param another
1453      * @return
1454      */
1455     public static boolean equals(String one, String another) {
1456         if (one == null) {
1457             if (another == null) {
1458                 return true;
1459             } else {
1460                 return false;
1461             }
1462         } else {
1463             if (another == null) {
1464                 return false;
1465             } else {
1466                 return one.equals(another);
1467             }
1468         }
1469     }
1470     
1471     /**
1472      * 获取字符串
1473      * @param value 字符串
1474      * @param maxLen 最大字符串长度
1475      * @return
1476      */
1477     public static String getSubStr(String value,int maxLen){
1478         if (value.length() > maxLen) {
1479             value = value.substring(0, maxLen);
1480         }
1481         return value;
1482     }
1483     
1484 }

 

posted @ 2018-06-14 20:28  安以北往南  阅读(1472)  评论(0编辑  收藏  举报