1 /**功能说明
2 * @param 公共方法
3 * @author
4 * @since 2013-4-15 下午02:04:56
5 */
6 package com.mall.common;
7
8 import java.io.UnsupportedEncodingException;
9 import java.lang.reflect.Array;
10 import java.text.DecimalFormat;
11 import java.text.SimpleDateFormat;
12 import java.util.Collection;
13 import java.util.Date;
14 import java.util.Map;
15 import java.util.StringTokenizer;
16
17 import org.apache.log4j.Logger;
18
19 import sun.misc.BASE64Decoder;
20
21 public class StringUtils {
22 private static Logger log=Logger.getLogger(StringUtils.class);
23
24 public static final String KEYWORD_IMPORT = "会员批量导入已经成功!";
25
26 public static final String ALLOWED_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!~*'()";
27
28 /**
29 * 转码
30 * @param input
31 * @return
32 */
33 public static String encodeURIComponent(String input) {
34 if (StringUtils.isEmpty(input)) {
35 return input;
36 }
37
38 int l = input.length();
39 StringBuilder o = new StringBuilder(l * 3);
40 try {
41 for (int i = 0; i < l; i++) {
42 String e = input.substring(i, i + 1);
43 if (ALLOWED_CHARS.indexOf(e) == -1) {
44 byte[] b = e.getBytes("utf-8");
45 o.append(getHex(b));
46 continue;
47 }
48 o.append(e);
49 }
50 return o.toString();
51 } catch (UnsupportedEncodingException e) {
52 log.error(e.getMessage());
53 }
54 return input;
55 }
56
57 /**
58 * 解码
59 * @param encodedURI
60 * @return
61 */
62 public static String decodeURIComponent(String encodedURI) {
63 char actualChar;
64
65 StringBuffer buffer = new StringBuffer();
66
67 int bytePattern, sumb = 0;
68
69 for (int i = 0, more = -1; i < encodedURI.length(); i++) {
70 actualChar = encodedURI.charAt(i);
71
72 switch (actualChar) {
73 case '%': {
74 actualChar = encodedURI.charAt(++i);
75 int hb = (Character.isDigit(actualChar) ? actualChar - '0'
76 : 10 + Character.toLowerCase(actualChar) - 'a') & 0xF;
77 actualChar = encodedURI.charAt(++i);
78 int lb = (Character.isDigit(actualChar) ? actualChar - '0'
79 : 10 + Character.toLowerCase(actualChar) - 'a') & 0xF;
80 bytePattern = (hb << 4) | lb;
81 break;
82 }
83 case '+': {
84 bytePattern = ' ';
85 break;
86 }
87 default: {
88 bytePattern = actualChar;
89 }
90 }
91
92 if ((bytePattern & 0xc0) == 0x80) { // 10xxxxxx
93 sumb = (sumb << 6) | (bytePattern & 0x3f);
94 if (--more == 0)
95 buffer.append((char) sumb);
96 } else if ((bytePattern & 0x80) == 0x00) { // 0xxxxxxx
97 buffer.append((char) bytePattern);
98 } else if ((bytePattern & 0xe0) == 0xc0) { // 110xxxxx
99 sumb = bytePattern & 0x1f;
100 more = 1;
101 } else if ((bytePattern & 0xf0) == 0xe0) { // 1110xxxx
102 sumb = bytePattern & 0x0f;
103 more = 2;
104 } else if ((bytePattern & 0xf8) == 0xf0) { // 11110xxx
105 sumb = bytePattern & 0x07;
106 more = 3;
107 } else if ((bytePattern & 0xfc) == 0xf8) { // 111110xx
108 sumb = bytePattern & 0x03;
109 more = 4;
110 } else { // 1111110x
111 sumb = bytePattern & 0x01;
112 more = 5;
113 }
114 }
115 return buffer.toString();
116 }
117
118 private static String getHex(byte buf[]) {
119 StringBuilder o = new StringBuilder(buf.length * 3);
120 for (int i = 0; i < buf.length; i++) {
121 int n = (int) buf[i] & 0xff;
122 o.append("%");
123 if (n < 0x10) {
124 o.append("0");
125 }
126 o.append(Long.toString(n, 16).toUpperCase());
127 }
128 return o.toString();
129 }
130
131 /**
132 * 判断某个对象是否为空 集合类、数组做特殊处理
133 *
134 * @param obj
135 * @return 如为空,返回true,否则false
136 * @author YZH
137 */
138 @SuppressWarnings("unchecked")
139 public static boolean isEmpty(Object obj) {
140 if (obj == null)
141 return true;
142
143 // 如果不为null,需要处理几种特殊对象类型
144 if (obj instanceof String) {
145 return obj.equals("");
146 } else if (obj instanceof Collection) {
147 // 对象为集合
148 Collection coll = (Collection) obj;
149 return coll.size() == 0;
150 } else if (obj instanceof Map) {
151 // 对象为Map
152 Map map = (Map) obj;
153 return map.size() == 0;
154 } else if (obj.getClass().isArray()) {
155 // 对象为数组
156 return Array.getLength(obj) == 0;
157 } else {
158 // 其他类型,只要不为null,即不为empty
159 return false;
160 }
161 }
162
163 /**
164 * 转码
165 * @param str
166 * @return
167 */
168 public static String encodeBase64(String str){
169 if (str == null){
170 return null;
171 }else{
172 return (new sun.misc.BASE64Encoder()).encode(str.getBytes() );
173 }
174 }
175
176 /**
177 * 解码
178 * @param args
179 */
180 public static String decodeBase64(String str){
181 if (str == null) {
182 return null;
183 }else{
184 BASE64Decoder decoder = new BASE64Decoder();
185 try {
186 byte[] b = decoder.decodeBuffer(str);
187 return new String(b);
188 } catch (Exception e) {
189 e.printStackTrace();
190 return null;
191 }
192 }
193 }
194
195 /**
196 * 使用StringTokenizer类将字符串按分隔符转换成字符数组
197 * @param string 字符串
198 * @param divisionChar 分隔符
199 * @return 字符串数组
200 * @see [类、类#方法、类#成员]
201 */
202 public static String[] stringAnalytical(String string, String divisionChar)
203 {
204 int i = 0;
205 StringTokenizer tokenizer = new StringTokenizer(string, divisionChar);
206
207 String[] str = new String[tokenizer.countTokens()];
208
209 while (tokenizer.hasMoreTokens())
210 {
211 str[i] = new String();
212 str[i] = tokenizer.nextToken();
213 i++;
214 }
215
216 return str;
217 }
218
219 /**
220 * 字符串解析,不使用StringTokenizer类和java.lang.String的split()方法
221 * 将字符串根据分割符转换成字符串数组
222 * @param string 字符串
223 * @param c 分隔符
224 * @return 解析后的字符串数组
225 */
226 public static String[] stringAnalytical(String string, char c)
227 {
228 //字符串中分隔符的个数
229 int count = 0;
230
231 //如果不含分割符则返回字符本身
232 if (string.indexOf(c) == -1)
233 {
234 return new String[]{string};
235 }
236
237 char[] cs = string.toCharArray();
238
239 //过滤掉第一个和最后一个是分隔符的情况
240 for (int i = 1; i < cs.length -1; i++)
241 {
242 if (cs[i] == c)
243 {
244 count++; //得到分隔符的个数
245 }
246 }
247
248 String[] strArray = new String[count + 1];
249 int k = 0, j = 0;
250 String str = string;
251
252 //去掉第一个字符是分隔符的情况
253 if ((k = str.indexOf(c)) == 0)
254 {
255 str = string.substring(k + 1);
256 }
257
258 //检测是否包含分割符,如果不含则返回字符串
259 if (str.indexOf(c) == -1)
260 {
261 return new String[]{str};
262 }
263
264 while ((k = str.indexOf(c)) != -1)
265 {
266 strArray[j++] = str.substring(0, k);
267 str = str.substring(k + 1);
268 if ((k = str.indexOf(c)) == -1 && str.length() > 0)
269 {
270 strArray[j++] = str.substring(0);
271 }
272 }
273
274 return strArray;
275 }
276
277 /**
278 * 去除null以及空格串
279 * @return:
280 * @author: YZH
281 */
282 public static String noNull(Object s) {
283 if (s == null)
284 return "";
285 else
286 return s.toString().trim();
287 }
288
289 /**
290 *
291 * {将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名}
292 * @param s 原文件名
293 * @return 重新编码后的文件名
294 * @author: YZH
295 */
296 public static String toUtf8String(String s) {
297 StringBuffer sb = new StringBuffer();
298 for (int i = 0; i < s.length(); i++) {
299 char c = s.charAt(i);
300 if ((c >= 0) && (c <= 255)) {
301 sb.append(c);
302 }
303 else {
304 byte[] b;
305
306 try {
307 b = Character.toString(c).getBytes("UTF-8");
308 }
309 catch (Exception ex) {
310 System.out.println(ex);
311 b = new byte[0];
312 }
313 for (int j = 0; j < b.length; j++) {
314 int k = b[j];
315 if (k < 0) {
316 k += 256;
317 }
318 sb.append("%" + Integer.toHexString(k).toUpperCase());
319 }
320 }
321 }
322 return sb.toString();
323 }
324
325 public static boolean arryContain(String[]arr,String s2){
326 for(int i=0;i<arr.length;i++){
327 String si=arr[i];
328 if(si.equals(s2)){
329 return true;
330 }
331 }
332 return false;
333 }
334 //格式化时间
335 public static String formatNum(Object num,String pattern){
336 DecimalFormat df = new DecimalFormat(pattern);
337 String db = df.format(num);
338 return db;
339 }
340 /**
341 *
342 * @param 要四舍五入的数(0.045)
343 * @param precision(2) 保留位数 0.05
344 * @return
345 */
346 public static String round(double val, int precision) {
347 Double ret = null;
348 try {
349 double factor = Math.pow(10, precision);
350 ret = Math.floor(val * factor + 0.5) / factor;
351 return ret+"";
352 } catch (Exception e) {
353 e.printStackTrace();
354 return val+"";
355 }
356 }
357
358 //字符串转换成日期(包括年月日时分秒)
359 public static Date stringToDateTime(String str,String pattern){
360 SimpleDateFormat sdf=new SimpleDateFormat(pattern);
361 Date dt=null;
362 try {
363 dt = sdf.parse(str);
364 return dt;
365 } catch (Exception e) {
366 e.printStackTrace();
367 return null;
368 }
369 }
370
371 public static String checkTips(String tips) {
372 StringBuffer sb = new StringBuffer();
373 sb.append("<script type=\"text/javascript\">").append("alert('").append(tips)
374 .append("');window.history.back();").append("</script>");
375 return sb.toString();
376 }
377
378 public static void main(String[]args){
379 String result=StringUtils.round(0.003d, 2);
380 String a = StringUtils.encodeBase64("aaaaa");
381 String b = StringUtils.decodeBase64(a);
382 System.out.println(result+"==="+a+"==="+b);
383 }
384 }