package com.itap.voiceemoticon.util;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.util.Log;
/**
*
* <br>==========================
* <br> author:Zenip
* <br> email:lxyczh@gmail.com
* <br> create:2013-1-26下午3:48:59
* <br>==========================
*/
public class StringUtil {
/** 空字符串。 */
public static final String EMPTY_STRING = "";
/**
* 判断配置字符串中是否包含对应的配置项.
* <br> StringUtil.defStrContains("1|2,3"|"1","|") =true
* <br> StringUtil.defStrContains("1|2|3","3","|") =true
* <br> StringUtil.defStrContains("1|2|3","2","|") =true
* <br> StringUtil.defStrContains("1|2|3","4","|") =false
* <br> StringUtil.defStrContains("1|2|3","","|") =false
* <br> StringUtil.defStrContains("1|2|3",null,"|") =false
* <br> <b>StringUtil.defStrContains("1|2|3","1|2","|") =true</b>
* <br> StringUtil.defStrContains("1|2|3","|2|","|") =true
* <br> StringUtil.defStrContains("1|2|3","|2|",",") =true
* <br> StringUtil.defStrContains("1|2|3","2",",") =false
*
* @param defStr
* 配置内容
* @param defValue
* 配置项的关键字
* @param splitSyb
* 分隔符号
* @return
*/
public static boolean defStrContains(String defStr, String defValue, String splitSyb) {
return (splitSyb + defStr + splitSyb).contains(splitSyb + defValue + splitSyb);
}
/**
* 将邮箱中间部分替换成星号
*
* <pre>
* StringUtil.asteriskReplace("upayTest@ucweb.com") = "upa*****@ucweb.com"
* </pre>
*
* @param str
* 被替换字符串
*
* @return 前三位或@后明文,中间为密文,若@前少于等于三位则将@前全部替换为*(fyg@ucweb.com--->***@ucweb.com)
* 不符合邮箱规则返回asteriskReplace(str) 若传入参数为null,直接返回null
*/
public static String asteriskEmailReplace(String str) {
if (StringUtil.isBlank(str))
return null;
StringBuffer replace = new StringBuffer();
if (str.matches("^.+@.+\\..+$")) {
if (str.indexOf("@") > 3)
replace.append(str.substring(0, 3));
replace.append("*****");
replace.append(str.substring(str.indexOf("@"), str.length()));
} else {
return asteriskReplace(str);
}
return replace.toString();
}
/**
* 将字符串中间部分替换成星号.
* <br />若长度大于6位则将中间部分替换成星号,保留前三位后三位,其他替换为4个星号
* <br />若长度大于2位且小于等于6位,则保留第一位,其他替换为3个星号
* <br />若长度小于等于2位则替换为2个星号
* <pre>
* str.length()>6:
* StringUtil.asteriskReplace("12345678") = "123****678"
* 2<str.length()<=6:
* StringUtil.asteriskReplace("1234") = "1***"
* str.length()<=2:
* StringUtil.asteriskReplace("12") = "**"
* </pre>
*
* @param str
* 被替换字符串
*
* @return
*/
public static String asteriskReplace(String str) {
if (StringUtil.isBlank(str))
return null;
StringBuffer replace = new StringBuffer();
if (str.length() > 6) {
replace.append(str.substring(0, 3));
replace.append("****");
replace.append(StringUtil.rightTrunc(str, 3));
} else if (str.length() > 2) {
replace.append(str.substring(0, 1)).append("***");
} else {
replace.append("**");
}
return replace.toString();
}
/**
* 比较两个字符串(大小写敏感)。
*
* <pre>
* StringUtil.equals(null, null) = true
* StringUtil.equals(null, "abc") = false
* StringUtil.equals("abc", null) = false
* StringUtil.equals("abc", "abc") = true
* StringUtil.equals("abc", "ABC") = false
* </pre>
*
* @param str1
* 要比较的字符串1
* @param str2
* 要比较的字符串2
*
* @return 如果两个字符串相同,或者都是<code>null</code>,则返回<code>true</code>
*/
public static boolean equals(String str1, String str2) {
if (str1 == null) {
return str2 == null;
}
return str1.equals(str2);
}
/**
* 比较两个字符串(大小写不敏感)。
*
* <pre>
* StringUtil.equalsIgnoreCase(null, null) = true
* StringUtil.equalsIgnoreCase(null, "abc") = false
* StringUtil.equalsIgnoreCase("abc", null) = false
* StringUtil.equalsIgnoreCase("abc", "abc") = true
* StringUtil.equalsIgnoreCase("abc", "ABC") = true
* </pre>
*
* @param str1
* 要比较的字符串1
* @param str2
* 要比较的字符串2
*
* @return 如果两个字符串相同,或者都是<code>null</code>,则返回<code>true</code>
*/
public static boolean equalsIgnoreCase(String str1, String str2) {
if (str1 == null) {
return str2 == null;
}
return str1.equalsIgnoreCase(str2);
}
/**
* 检查字符串是否是空白:<code>null</code>、空字符串<code>""</code>或只有空白字符。
*
* <pre>
* StringUtil.isBlank(null) = true
* StringUtil.isBlank("") = true
* StringUtil.isBlank(" ") = true
* StringUtil.isBlank("bob") = false
* StringUtil.isBlank(" bob ") = false
* </pre>
*
* @param str
* 要检查的字符串
*
* @return 如果为空白, 则返回<code>true</code>
*/
public static boolean isBlank(String str) {
int length;
if ((str == null) || ((length = str.length()) == 0)) {
return true;
}
for (int i = 0; i < length; i++) {
if (!Character.isWhitespace(str.charAt(i))) {
return false;
}
}
return true;
}
/**
* 检查字符串是否不是空白:<code>null</code>、空字符串<code>""</code>或只有空白字符。
*
* <pre>
* StringUtil.isNotBlank(null) = false
* StringUtil.isNotBlank("") = false
* StringUtil.isNotBlank(" ") = false
* StringUtil.isNotBlank("bob") = true
* StringUtil.isNotBlank(" bob ") = true
* </pre>
*
* @param str
* 要检查的字符串
*
* @return 如果为空白, 则返回<code>true</code>
*/
public static boolean isNotBlank(String str) {
int length;
if ((str == null) || ((length = str.length()) == 0)) {
return false;
}
for (int i = 0; i < length; i++) {
if (!Character.isWhitespace(str.charAt(i))) {
return true;
}
}
return false;
}
/**
* 检查字符串是否为<code>null</code>或空字符串<code>""</code>。
*
* <pre>
* StringUtil.isEmpty(null) = true
* StringUtil.isEmpty("") = true
* StringUtil.isEmpty(" ") = false
* StringUtil.isEmpty("bob") = false
* StringUtil.isEmpty(" bob ") = false
* </pre>
*
* @param str
* 要检查的字符串
*
* @return 如果为空, 则返回<code>true</code>
*/
public static boolean isEmpty(String str) {
return ((str == null) || (str.length() == 0));
}
/**
* 检查字符串是否不是<code>null</code>和空字符串<code>""</code>。
*
* <pre>
* StringUtil.isNotEmpty(null) = false
* StringUtil.isNotEmpty("") = false
* StringUtil.isNotEmpty(" ") = true
* StringUtil.isNotEmpty("bob") = true
* StringUtil.isNotEmpty(" bob ") = true
* </pre>
*
* @param str
* 要检查的字符串
*
* @return 如果不为空, 则返回<code>true</code>
*/
public static boolean isNotEmpty(String str) {
return ((str != null) && (str.length() > 0));
}
/**
* 在字符串中查找指定字符串,并返回第一个匹配的索引值。如果字符串为<code>null</code>或未找到,则返回<code>-1</code>。
*
* <pre>
* StringUtil.indexOf(null, *) = -1
* StringUtil.indexOf(*, null) = -1
* StringUtil.indexOf("", "") = 0
* StringUtil.indexOf("aabaabaa", "a") = 0
* StringUtil.indexOf("aabaabaa", "b") = 2
* StringUtil.indexOf("aabaabaa", "ab") = 1
* StringUtil.indexOf("aabaabaa", "") = 0
* </pre>
*
* @param str
* 要扫描的字符串
* @param searchStr
* 要查找的字符串
*
* @return 第一个匹配的索引值。如果字符串为<code>null</code>或未找到,则返回<code>-1</code>
*/
public static int indexOf(String str, String searchStr) {
if ((str == null) || (searchStr == null)) {
return -1;
}
return str.indexOf(searchStr);
}
/**
* 在字符串中查找指定字符串,并返回第一个匹配的索引值。如果字符串为<code>null</code>或未找到,则返回<code>-1</code>。
*
* <pre>
* StringUtil.indexOf(null, *, *) = -1
* StringUtil.indexOf(*, null, *) = -1
* StringUtil.indexOf("", "", 0) = 0
* StringUtil.indexOf("aabaabaa", "a", 0) = 0
* StringUtil.indexOf("aabaabaa", "b", 0) = 2
* StringUtil.indexOf("aabaabaa", "ab", 0) = 1
* StringUtil.indexOf("aabaabaa", "b", 3) = 5
* StringUtil.indexOf("aabaabaa", "b", 9) = -1
* StringUtil.indexOf("aabaabaa", "b", -1) = 2
* StringUtil.indexOf("aabaabaa", "", 2) = 2
* StringUtil.indexOf("abc", "", 9) = 3
* </pre>
*
* @param str
* 要扫描的字符串
* @param searchStr
* 要查找的字符串
* @param startPos
* 开始搜索的索引值,如果小于0,则看作0
*
* @return 第一个匹配的索引值。如果字符串为<code>null</code>或未找到,则返回<code>-1</code>
*/
public static int indexOf(String str, String searchStr, int startPos) {
if ((str == null) || (searchStr == null)) {
return -1;
}
// JDK1.3及以下版本的bug:不能正确处理下面的情况
if ((searchStr.length() == 0) && (startPos >= str.length())) {
return str.length();
}
return str.indexOf(searchStr, startPos);
}
/**
* 取指定字符串的子串。
*
* <p>
* 负的索引代表从尾部开始计算。如果字符串为<code>null</code>,则返回<code>null</code>。
*
* <pre>
* StringUtil.substring(null, *, *) = null
* StringUtil.substring("", * , *) = "";
* StringUtil.substring("abc", 0, 2) = "ab"
* StringUtil.substring("abc", 2, 0) = ""
* StringUtil.substring("abc", 2, 4) = "c"
* StringUtil.substring("abc", 4, 6) = ""
* StringUtil.substring("abc", 2, 2) = ""
* StringUtil.substring("abc", -2, -1) = "b"
* StringUtil.substring("abc", -4, 2) = "ab"
* </pre>
*
* </p>
*
* @param str
* 字符串
* @param start
* 起始索引,如果为负数,表示从尾部计算
* @param end
* 结束索引(不含),如果为负数,表示从尾部计算
*
* @return 子串,如果原始串为<code>null</code>,则返回<code>null</code>
*/
public static String substring(String str, int start, int end) {
if (str == null) {
return null;
}
if (end < 0) {
end = str.length() + end;
}
if (start < 0) {
start = str.length() + start;
}
if (end > str.length()) {
end = str.length();
}
if (start > end) {
return EMPTY_STRING;
}
if (start < 0) {
start = 0;
}
if (end < 0) {
end = 0;
}
return str.substring(start, end);
}
/**
* 检查字符串中是否包含指定的字符串。如果字符串为<code>null</code>,将返回<code>false</code>。
*
* <pre>
* StringUtil.contains(null, *) = false
* StringUtil.contains(*, null) = false
* StringUtil.contains("", "") = true
* StringUtil.contains("abc", "") = true
* StringUtil.contains("abc", "a") = true
* StringUtil.contains("abc", "z") = false
* </pre>
*
* @param str
* 要扫描的字符串
* @param searchStr
* 要查找的字符串
*
* @return 如果找到,则返回<code>true</code>
*/
public static boolean contains(String str, String searchStr) {
if ((str == null) || (searchStr == null)) {
return false;
}
return str.indexOf(searchStr) >= 0;
}
/**
* <p>
* Checks if the String contains only unicode digits. A decimal point is not
* a unicode digit and returns false.
* </p>
*
* <p>
* <code>null</code> will return <code>false</code>. An empty String ("")
* will return <code>true</code>.
* </p>
*
* <pre>
* StringUtils.isNumeric(null) = false
* StringUtils.isNumeric("") = true
* StringUtils.isNumeric(" ") = false
* StringUtils.isNumeric("123") = true
* StringUtils.isNumeric("12 3") = false
* StringUtils.isNumeric("ab2c") = false
* StringUtils.isNumeric("12-3") = false
* StringUtils.isNumeric("12.3") = false
* </pre>
*
* @param str
* the String to check, may be null
* @return <code>true</code> if only contains digits, and is non-null
*/
public static boolean isNumeric(String str) {
if (str == null) {
return false;
}
int sz = str.length();
for (int i = 0; i < sz; i++) {
if (Character.isDigit(str.charAt(i)) == false) {
return false;
}
}
return true;
}
/**
* 将url参数形式的字符串转换为map,
* <br /> 如果某个key重复出现,则只留最后一次出现的值
* <br /> 若某个value URLDecode失败,则返回null
*
* @param queryString
* @param enc
* key-value中的value的URLDecode编码
* @param keepEmptyValue
* 如果某个'key-value对'没有=号,是否包括此对,但将value设置为null
* @return
*/
public static Map<String, String> urlToSingleMap(String queryString, String enc, boolean keepEmptyValue) {
Map<String, String> pMap = new HashMap<String, String>();
if (isBlank(queryString)) {
return null;
}
String[] secs = queryString.split("&");
for (String sec : secs) {
if (sec.indexOf("=") < 0) {
if (keepEmptyValue) {
pMap.put(sec, null);
}
} else {
String[] kv = sec.split("=", 2);
String value = kv[1];
try {
value = URLDecoder.decode(value, enc);
} catch (UnsupportedEncodingException e) {
return null;
}
pMap.put(kv[0], value);
}
}
if (pMap.isEmpty()) {
return null;
} else {
return pMap;
}
}
/**
* 将url参数形式的字符串转换为map
*
* @param queryString
* @param enc
* @return
*/
public static Map<String, String[]> urlToMap(String queryString, String enc) {
Map<String, String[]> paramsMap = new HashMap<String, String[]>();
if (queryString != null && queryString.length() > 0) {
int ampersandIndex, lastAmpersandIndex = 0;
String subStr, param, value;
String[] paramPair, values, newValues;
do {
ampersandIndex = queryString.indexOf('&', lastAmpersandIndex) + 1;
if (ampersandIndex > 0) {
subStr = queryString.substring(lastAmpersandIndex, ampersandIndex - 1);
lastAmpersandIndex = ampersandIndex;
} else {
subStr = queryString.substring(lastAmpersandIndex);
}
paramPair = subStr.split("=");
param = paramPair[0];
value = paramPair.length == 1 ? "" : paramPair[1];
try {
value = URLDecoder.decode(value, enc);
} catch (UnsupportedEncodingException ignored) {
}
if (paramsMap.containsKey(param)) {
values = paramsMap.get(param);
int len = values.length;
newValues = new String[len + 1];
System.arraycopy(values, 0, newValues, 0, len);
newValues[len] = value;
} else {
newValues = new String[] { value };
}
paramsMap.put(param, newValues);
} while (ampersandIndex > 0);
}
if (paramsMap.isEmpty()) {
return null;
} else {
return paramsMap;
}
}
/**
* 将普通字符串转为16进制大写字符串
*
* @param str
* @return
*/
public static String str2HexStr(String str) {
byte[] bytes = str.getBytes();
int bLen = bytes.length;
StringBuffer buf = new StringBuffer(bLen * 2);
int i;
for (i = 0; i < bLen; i++) {
if (((int) bytes[i] & 0xff) < 0x10) {
buf.append("0");
}
buf.append(Long.toString((int) bytes[i] & 0xff, 16));
}
return buf.toString().toUpperCase();
}
/**
* 将16进制字符串其对应的普通字符串
*
* @param str
* @return
*/
public static String hexStr2Str(String str) {
int bLen = str.length() / 2;
byte[] bytes = new byte[bLen];
for (int i = 0; i < bLen; i++) {
int index = i * 2;
int v = Integer.parseInt(str.substring(index, index + 2), 16);
bytes[i] = (byte) v;
}
return new String(bytes);
}
/**
* 从url中提取domain部分,如果没有`/`符号,则返回传入内容
* <pre>
* StringUtil.getDomain("http://www.uc.cn/abc")="www.uc.cn"
* StringUtil.getDomain("www.uc.cn:8080/abc")="www.uc.cn:8080"
* StringUtil.getDomain("abc")="abc"
* </pre>
*
* @param url
* @return
*/
public static String getDomain(String url) {
String[] ary = url.split("/");
if (ary.length > 3 && (ary[0].equalsIgnoreCase("http:") || ary[0].equalsIgnoreCase("https:")) && ary[1].equals("")) {
return ary[2];
} else if (ary.length > 0) {
return ary[1];
} else {
return url;
}
}
/**
* 从url中提取domain部分,如果没有`/`符号,则返回传入内容,并去除端口号
* <pre>
* StringUtil.getDomainWithoutPort("http://www.uc.cn:8080/abc")="www.uc.cn"
* </pre>
*
* @param url
* @return
*/
public static String getDomainWithoutPort(String url) {
if (url == null)
return null;
String domain = getDomain(url);
String[] arrs = domain.split(":");
if (arrs.length == 2)
return arrs[0];
else
return domain;
}
/**
* 从末尾倒数截取str中指定长度的内容<br />
* 若str 为 null,返回null<br />
* 若str.length<=len,返回str<br />
* 若len<0 返回str
*
* @param str
* 被截取的字符
* @param len
* 截取长度
* @return
*/
public static String rightTrunc(String str, int len) {
if (str == null) {
return null;
}
int strLen = str.length();
if (strLen <= len || len < 0) {
return str;
}
return str.substring(strLen - len);
}
public static String map2String(Map<String, String> map, String[] notIn) {
StringBuffer sbuf = new StringBuffer("");
List<String> list = Arrays.asList(notIn);
String and = "";
for (String key : map.keySet()) {
if (!list.contains(key)) {
sbuf.append(and);
sbuf.append(key).append("=").append(map.get(key));
and = "&";
}
}
return sbuf.toString();
}
/**
* 统计c在str出现的次数
* <br /> src为null 返回0
* <br /> c为null 返回0
*
* @param src
* 字符串
* @param c的单个字符
* @return 出现的次数
*/
public static int countRepeat(String src, char c) {
if (src == null) {
return 0;
}
int count = 0;
for (int i = 0; i < src.length(); i++) {
Character cr = src.charAt(i);
if (c == cr) {
count++;
}
}
return count;
}
/**
* 取得指定子串在字符串中出现的次数。
* <p/>
* <p>
* 如果字符串为<code>null</code>或空,则返回<code>0</code>。
* <pre>
* StringUtil.countRepeat(null, *) = 0
* StringUtil.countRepeat("", *) = 0
* StringUtil.countRepeat("abba", null) = 0
* StringUtil.countRepeat("abba", "") = 0
* StringUtil.countRepeat("abba", "a") = 2
* StringUtil.countRepeat("abba", "ab") = 1
* StringUtil.countRepeat("abba", "xxx") = 0
* StringUtil.countRepeat("aaaa", "aa") = 3
* </pre>
* </p>
*
* @param str
* 要扫描的字符串
* @param subStr
* 子字符串
* @return 子串在字符串中出现的次数,如果字符串为<code>null</code>或空,则返回<code>0</code>
*/
public static int countRepeat(String str, String subStr) {
if ((str == null) || (str.length() == 0) || (subStr == null) || (subStr.length() == 0)) {
return 0;
}
int count = 0;
int index = 0;
while ((index = str.indexOf(subStr, index)) != -1) {
count++;
index++;
}
return count;
}
public static String getCurrentDateTimeStringDefault() {
Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
String str = (String) android.text.format.DateFormat.format("yyyy年MM月dd日 hh:mm:ss", curDate);
return str;
}
public static String formatFloatAmount(float amount) {
DecimalFormat df = new DecimalFormat("#0.##");
return df.format(amount);
}
public static Date parseStringToDate(String dateString, String dateFormat) {
SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);
Date dt = null;
try {
dt = formatter.parse(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
return dt;
}
public static String join(ArrayList<Long> list, String separator) {
String retStr = "";
for (int i = 0, len = list.size(); i < len; i++) {
if (i == 0) {
retStr += list.get(i).toString();
} else {
retStr += separator + list.get(i).toString();
}
}
return retStr;
}
/**
* 将对象转化成json字符串
*
* @param src
* @return
*/
public static String toJsonStr(Object src) {
return "";
}
/**
* 判断字符串是否为空或空白串
*
* @author wangcj@ucweb.com
* <br> Create: 2012-07-19
*
* @param s
* 待判断字符串
* @return true - 是null、空串或空白串; false - 是具有实际内容的字符串
*/
public static boolean isNullOrEmpty(String s) {
return (s == null || s.length() == 0 || s.trim().length() == 0);
}
/**
* 判断输入的邮箱字符串是否合法
*
* @author chenbl@ucweb.com
* <br> Create: 2012-12-03
*
* @param emailString
* 带判断的字符串
* @return
* true 输入的字符串是合法邮箱地址;false 输入的字符串不是合法邮箱地址
*/
public static boolean isEmailString(String emailString) {
Pattern pattern = Pattern.compile("^([\\w]+([\\w-\\.+]*[\\w-]+)?)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([\\w-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$");
Matcher matcher = pattern.matcher(emailString);
return matcher.matches();
}
}