1 package com.gzcivil.utils; 2 3 import java.io.BufferedReader; 4 import java.io.ByteArrayOutputStream; 5 import java.io.InputStream; 6 import java.io.InputStreamReader; 7 import java.math.BigDecimal; 8 import java.text.SimpleDateFormat; 9 import java.util.Arrays; 10 import java.util.Calendar; 11 import java.util.Date; 12 import java.util.Locale; 13 import java.util.StringTokenizer; 14 import java.util.regex.Matcher; 15 import java.util.regex.Pattern; 16 17 /** 18 * 字符串工具 19 * 20 * @author LiJinlun 21 * @time 2015-12-5 22 */ 23 public class StringUtils { 24 25 private static StringUtils instance; 26 27 private StringUtils() { 28 super(); 29 } 30 31 public static String getDateTimeToString(Calendar cal, String format) { 32 return getDateTimeToString(cal.getTimeInMillis(), format); 33 } 34 35 public static String getDateTimeToString(long longTime, String format) { 36 SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.getDefault()); 37 Date date = new Date(longTime); 38 return sdf.format(date); 39 } 40 41 public static synchronized StringUtils getInstance() { 42 if (instance == null) 43 instance = new StringUtils(); 44 return instance; 45 } 46 47 /** 将一个字符串从第一位开始截取到有数字出现的地方 */ 48 public static String clearNumberString(String str) { 49 int minIndex = Integer.MAX_VALUE; 50 int[] index = new int[10]; 51 for (int i = 0; i < 10; i++) { 52 index[i] = str.indexOf(String.valueOf(i)); 53 if (index[i] != -1 && index[i] < minIndex) { 54 minIndex = index[i]; 55 } 56 } 57 if (minIndex < Integer.MAX_VALUE) { 58 str = str.substring(0, minIndex); 59 } 60 return str; 61 } 62 63 /** 64 * 判断字符串是否为空 65 */ 66 public static boolean isEmpty(String str) { 67 return null == str || str.trim().equals(""); 68 } 69 70 /** 71 * 描述:手机号格式验证. 72 * 73 * @param str 74 * 指定的手机号码字符串 75 * @return 是否为手机号码格式:是为true,否则false 76 */ 77 public static Boolean isMobilePhone(String str) { 78 Boolean isMobileNo = false; 79 try { 80 Pattern p = Pattern.compile("^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\\d{8}$"); 81 Matcher m = p.matcher(str); 82 isMobileNo = m.matches(); 83 } catch (Exception e) { 84 e.printStackTrace(); 85 } 86 return isMobileNo; 87 } 88 89 /** 90 * 获取字串字节长度 91 * 92 * @param str 93 * @return 94 */ 95 public static int getLength(String str) { 96 return str.replaceAll("[^\\x00-\\xff]", "**").trim().length(); 97 } 98 99 /** 返回double数据d小数点后面2位有效数字 */ 100 public static double getDouble(double d) { 101 return new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); 102 } 103 104 /** 从double型返回String型,精确到小数点后2位 */ 105 public static String getStringByDouble(double d) { 106 String str = String.valueOf(new BigDecimal(d).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue()); 107 try { 108 int index = str.indexOf(‘.‘); 109 if (index != -1) { 110 String tmpStr = str.substring(index + 1); 111 if ("0".equals(tmpStr)) { 112 str = str.substring(0, index); 113 } 114 } 115 } catch (Exception e) { 116 e.printStackTrace(); 117 } 118 return str; 119 } 120 121 public static String getCorrectDistance(int distance) { 122 String result = ""; 123 if (distance < 20) { 124 result = "附近"; 125 } else if (distance < 1000) { 126 result = distance + "m"; 127 } else { 128 result = String.format("%.1f", distance / 1000f) + "km"; 129 } 130 return result; 131 } 132 133 /** 134 * 将秒数转换成文字描述 135 * 136 * @param tm单位秒 137 */ 138 public static String secondsToString(int tm) { 139 if (tm <= 0) 140 return "00:00:00"; 141 long hour = tm / 3600; 142 tm = tm % 3600; 143 long min = tm / 60; 144 tm = tm % 60; 145 146 String result = ""; 147 if (hour < 10) { 148 result = "0" + hour + ":"; 149 } else { 150 result = String.valueOf(hour) + ":"; 151 } 152 153 if (min < 10) { 154 result += "0" + min + ":"; 155 } else { 156 result += min + ":"; 157 } 158 159 if (tm < 10) { 160 result += "0" + tm; 161 } else { 162 result += String.valueOf(tm); 163 } 164 return result; 165 } 166 167 /** 168 * 检测是否JSON字串 169 * 170 * @param source 171 * @return 172 */ 173 public static boolean isJson(String source) { 174 String tmp = null == source ? "" : source.trim(); 175 if ("".equals(tmp) || tmp.length() < 1) 176 return false; 177 else if (tmp.startsWith("{") && tmp.endsWith("}")) 178 return true; 179 else if (tmp.startsWith("[") && tmp.endsWith("]")) 180 return true; 181 else 182 return false; 183 } 184 185 public static String str2int(String source) { 186 String result = ""; 187 LogUtils.i("ls", "result" + result); 188 for (int i = 0; i < source.length(); i++) { 189 if (source.charAt(i) >= ‘0‘ && source.charAt(i) <= ‘9‘) 190 result += source.charAt(i); 191 192 } 193 return result; 194 } 195 196 /** 197 * MD5编码 198 * 199 * @param source 200 * @return 201 */ 202 public static String md5(byte[] source) { 203 char hexDigits[] = { ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘ }; 204 try { 205 java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5"); 206 md.update(source); 207 byte tmp[] = md.digest(); 208 char str[] = new char[16 * 2]; 209 for (int i = 0, k = 0; i < 16; i++) { 210 byte byte0 = tmp[i]; 211 str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 212 str[k++] = hexDigits[byte0 & 0xf]; 213 } 214 return new String(str); 215 } catch (Exception e) { 216 LogUtils.e("md5(): error=" + e.getMessage(), "StringTool"); 217 return ""; 218 } 219 } 220 221 /** 222 * base64编码,将字节数组编码为字符串 223 * 224 * @param source 225 * @return String 226 */ 227 public static String base64_encode(byte[] source) { 228 char[] base64EncodeChars = new char[] { ‘A‘, ‘B‘, ‘C‘, ‘D‘, ‘E‘, ‘F‘, ‘G‘, ‘H‘, ‘I‘, ‘J‘, ‘K‘, ‘L‘, ‘M‘, ‘N‘, ‘O‘, ‘P‘, ‘Q‘, ‘R‘, ‘S‘, ‘T‘, ‘U‘, ‘V‘, ‘W‘, ‘X‘, ‘Y‘, ‘Z‘, ‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘, ‘i‘, ‘j‘, ‘k‘, ‘l‘, ‘m‘, ‘n‘, ‘o‘, ‘p‘, ‘q‘, ‘r‘, ‘s‘, ‘t‘, ‘u‘, ‘v‘, ‘w‘, ‘x‘, ‘y‘, ‘z‘, ‘0‘, ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘, ‘6‘, ‘7‘, ‘8‘, ‘9‘, ‘+‘, ‘/‘ }; 229 try { 230 StringBuffer sb = new StringBuffer(); 231 int len = source.length; 232 int i = 0; 233 int b1, b2, b3; 234 while (i < len) { 235 b1 = source[i++] & 0xff; 236 if (i == len) { 237 sb.append(base64EncodeChars[b1 >>> 2]); 238 sb.append(base64EncodeChars[(b1 & 0x3) << 4]); 239 sb.append("=="); 240 break; 241 } 242 b2 = source[i++] & 0xff; 243 if (i == len) { 244 sb.append(base64EncodeChars[b1 >>> 2]); 245 sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); 246 sb.append(base64EncodeChars[(b2 & 0x0f) << 2]); 247 sb.append("="); 248 break; 249 } 250 b3 = source[i++] & 0xff; 251 sb.append(base64EncodeChars[b1 >>> 2]); 252 sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); 253 sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); 254 sb.append(base64EncodeChars[b3 & 0x3f]); 255 } 256 return sb.toString(); 257 } catch (Exception e) { 258 LogUtils.e("base64_encode(): error=" + e.getMessage(), "StringTool"); 259 return ""; 260 } 261 } 262 263 /** 264 * base64编码,解码为字节数组 265 * 266 * @param source 267 * @return byte[] 268 */ 269 public static byte[] base64_decode(String source) { 270 byte[] base64DecodeChars = new byte[] { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1 }; 271 try { 272 byte[] data = source.getBytes(); 273 int len = data.length; 274 ByteArrayOutputStream buf = new ByteArrayOutputStream(len); 275 int i = 0; 276 int b1, b2, b3, b4; 277 while (i < len) { 278 /* b1 */ 279 do { 280 b1 = base64DecodeChars[data[i++]]; 281 } while (i < len && b1 == -1); 282 if (b1 == -1) 283 break; 284 285 /* b2 */ 286 do { 287 b2 = base64DecodeChars[data[i++]]; 288 } while (i < len && b2 == -1); 289 if (b2 == -1) 290 break; 291 buf.write((int) ((b1 << 2) | ((b2 & 0x30) >>> 4))); 292 293 /* b3 */ 294 do { 295 b3 = data[i++]; 296 if (b3 == 61) 297 return buf.toByteArray(); 298 b3 = base64DecodeChars[b3]; 299 } while (i < len && b3 == -1); 300 if (b3 == -1) 301 break; 302 buf.write((int) (((b2 & 0x0f) << 4) | ((b3 & 0x3c) >>> 2))); 303 304 /* b4 */ 305 do { 306 b4 = data[i++]; 307 if (b4 == 61) 308 return buf.toByteArray(); 309 b4 = base64DecodeChars[b4]; 310 } while (i < len && b4 == -1); 311 if (b4 == -1) 312 break; 313 buf.write((int) (((b3 & 0x03) << 6) | b4)); 314 } 315 return buf.toByteArray(); 316 } catch (Exception e) { 317 LogUtils.i("ls", "base64_decode(): error=" + e.getMessage()); 318 return "".getBytes(); 319 } 320 } 321 322 public static String join(String separator, Object[] o) { 323 return implode(separator, Arrays.asList(o)); 324 } 325 326 protected static <T> String implode(String separator, Iterable<T> elements) { 327 StringBuilder out = new StringBuilder(); 328 boolean first = true; 329 for (Object s : elements) { 330 if (s == null) 331 continue; 332 else if (first) 333 first = false; 334 else 335 out.append(separator); 336 out.append(s); 337 } 338 return out.toString(); 339 } 340 341 public static String[] explode(String glue, String str) { 342 String[] outData; 343 try { 344 StringTokenizer st = new StringTokenizer(str, glue); 345 outData = new String[st.countTokens()]; 346 for (int i = 0; st.hasMoreTokens();) { 347 outData[i++] = st.nextToken(); 348 } 349 } catch (Exception e) { 350 outData = new String[] { str }; 351 e.printStackTrace(); 352 } 353 return outData; 354 } 355 356 /** 357 * 得到字符串双字节长度 358 * 359 * @param str 360 * @return 361 */ 362 public static int getDoubleByteLength(String str) { 363 return str.replaceAll("[^\\x00-\\xff]", "xx").trim().length(); 364 } 365 366 /** 367 * 将流转换成字符串 368 * 369 * @param is 370 * @return 371 */ 372 public static String getStringByStream(InputStream is) { 373 StringBuffer sb = new StringBuffer(); 374 try { 375 BufferedReader br = new BufferedReader(new InputStreamReader(is)); 376 String line = null; 377 while ((line = br.readLine()) != null) { 378 sb.append(line); 379 } 380 } catch (Exception e) { 381 e.printStackTrace(); 382 } 383 return sb.toString(); 384 } 385 386 /** 387 * 将流转换成字符串 388 * 389 * @param is 390 * @param chatset 391 * 字符编码 392 * @return 393 */ 394 public static String getStringByStream(InputStream is, String chatset) { 395 StringBuffer sb = new StringBuffer(); 396 try { 397 byte[] bytes = new byte[1024]; 398 int len = 0; 399 while ((len = is.read(bytes)) != -1) { 400 sb.append(new String(bytes, 0, len, chatset)); 401 } 402 } catch (Exception e) { 403 // TODO: handle exception 404 e.printStackTrace(); 405 } 406 return sb.toString(); 407 } 408 409 }
时间: 2024-11-05 16:11:33