
zikai.apijson.core.StringUtil Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of zikai-apijson Show documentation
Show all versions of zikai-apijson Show documentation
apijson的简化版本,升级fastjson到2.0
The newest version!
/*Copyright (C) 2020 THL A29 Limited, a Tencent company. All rights reserved.
This source code is licensed under the Apache License Version 2.0.*/
package zikai.apijson.core;
import java.io.File;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Objects;
import java.util.regex.Pattern;
/**通用字符串(String)相关类,为null时返回""
* @author Lemon
* @use StringUtil.
*/
public class StringUtil {
private static final String TAG = "StringUtil";
public StringUtil() {
}
public static final String UTF_8 = "utf-8";
public static final String EMPTY = "无";
public static final String UNKNOWN = "未知";
public static final String UNLIMITED = "不限";
public static final String I = "我";
public static final String YOU = "你";
public static final String HE = "他";
public static final String SHE = "她";
public static final String IT = "它";
public static final String MALE = "男";
public static final String FEMALE = "女";
public static final String TODO = "未完成";
public static final String DONE = "已完成";
public static final String FAIL = "失败";
public static final String SUCCESS = "成功";
public static final String SUNDAY = "日";
public static final String MONDAY = "一";
public static final String TUESDAY = "二";
public static final String WEDNESDAY = "三";
public static final String THURSDAY = "四";
public static final String FRIDAY = "五";
public static final String SATURDAY = "六";
public static final String YUAN = "元";
private static String currentString = "";
/**获取刚传入处理后的string
* @must 上个影响currentString的方法 和 这个方法都应该在同一线程中,否则返回值可能不对
* @return
*/
public static String getCurrentString() {
return currentString == null ? "" : currentString;
}
//获取string,为null时返回"" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**获取string,为null则返回""
* @param object
* @return
*/
public static String getString(Object object) {
return object == null ? "" : object.toString();
}
/**获取string,为null则返回""
* @param cs
* @return
*/
public static String getString(CharSequence cs) {
return cs == null ? "" : cs.toString();
}
/**获取string,为null则返回""
* @param s
* @return
*/
public static String getString(String s) {
return s == null ? "" : s;
}
/**获取string,为null则返回""
* ignoreEmptyItem = false;
* split = ","
* @param array
* @return {@link #getString(Object[], boolean)}
*/
public static String getString(Object[] array) {
return getString(array, false);
}
/**获取string,为null则返回""
* split = ","
* @param array
* @param ignoreEmptyItem
* @return {@link #getString(Object[], boolean)}
*/
public static String getString(Object[] array, boolean ignoreEmptyItem) {
return getString(array, null, ignoreEmptyItem);
}
/**获取string,为null则返回""
* ignoreEmptyItem = false;
* @param array
* @param split
* @return {@link #getString(Object[], String, boolean)}
*/
public static String getString(Object[] array, String split) {
return getString(array, split, false);
}
//CS304 Issue link: https://github.com/Tencent/APIJSON/issues/182
/**获取string,为null则返回""
* @param array -the str array given
* @param split -the token used to split
* @param ignoreEmptyItem -whether to ignore empty item or not
* @return {@link #getString(Object[], String, boolean)}
* Here we replace the simple "+" way of concatenating with Stringbuilder 's append
*/
public static String getString(Object[] array, String split, boolean ignoreEmptyItem) {
StringBuilder s = new StringBuilder("");
if (array != null) {
if (split == null) {
split = ",";
}
for (int i = 0; i < array.length; i++) {
if (ignoreEmptyItem && isEmpty(array[i], true)) {
continue;
}
s.append(((i > 0 ? split : "") + array[i]));
}
}
return getString(s.toString());
}
//获取string,为null时返回"" >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//获取去掉前后空格后的string<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**获取去掉前后空格后的string,为null则返回""
* @param object
* @return
*/
public static String getTrimedString(Object object) {
return getTrimedString(getString(object));
}
/**获取去掉前后空格后的string,为null则返回""
* @param cs
* @return
*/
public static String getTrimedString(CharSequence cs) {
return getTrimedString(getString(cs));
}
/**获取去掉前后空格后的string,为null则返回""
* @param s
* @return
*/
public static String getTrimedString(String s) {
return getString(s).trim();
}
//获取去掉前后空格后的string>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//获取去掉所有空格后的string <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**获取去掉所有空格后的string,为null则返回""
* @param object
* @return
*/
public static String getNoBlankString(Object object) {
return getNoBlankString(getString(object));
}
/**获取去掉所有空格后的string,为null则返回""
* @param cs
* @return
*/
public static String getNoBlankString(CharSequence cs) {
return getNoBlankString(getString(cs));
}
/**获取去掉所有空格后的string,为null则返回""
* @param s
* @return
*/
public static String getNoBlankString(String s) {
return getString(s).replaceAll("\\s", "");
}
//获取去掉所有空格后的string >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//获取string的长度<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**获取string的长度,为null则返回0
* @param object
* @param trim
* @return
*/
public static int getLength(Object object, boolean trim) {
return getLength(getString(object), trim);
}
/**获取string的长度,为null则返回0
* @param cs
* @param trim
* @return
*/
public static int getLength(CharSequence cs, boolean trim) {
return getLength(getString(cs), trim);
}
/**获取string的长度,为null则返回0
* @param s
* @param trim
* @return
*/
public static int getLength(String s, boolean trim) {
s = trim ? getTrimedString(s) : s;
return getString(s).length();
}
//获取string的长度>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//判断字符是否为空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**判断字符是否为空 trim = true
* @param obj
* @return
*/
public static boolean isEmpty(Object obj) {
return isEmpty(obj, true);
}
/**判断字符是否为空
* @param obj
* @param trim
* @return
*/
public static boolean isEmpty(Object obj, boolean trim) {
return isEmpty(getString(obj), trim);
}
/**判断字符是否为空 trim = true
* @param cs
* @return
*/
public static boolean isEmpty(CharSequence cs) {
return isEmpty(cs, true);
}
/**判断字符是否为空
* @param cs
* @param trim
* @return
*/
public static boolean isEmpty(CharSequence cs, boolean trim) {
return isEmpty(getString(cs), trim);
}
/**判断字符是否为空 trim = true
* @param s
* @return
*/
public static boolean isEmpty(String s) {
return isEmpty(s, true);
}
/**判断字符是否为空
* @param s
* @param trim
* @return
*/
public static boolean isEmpty(String s, boolean trim) {
// Log.i(TAG, "getTrimedString s = " + s);
if (s == null) {
return true;
}
if (trim) {
s = s.trim();
}
if (s.isEmpty()) {
return true;
}
currentString = s;
return false;
}
//判断字符是否为空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//判断字符是否非空 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**判断字符是否非空 trim = true
* @param object
* @return
*/
public static boolean isNotEmpty(Object obj) {
return ! isEmpty(obj);
}
/**判断字符是否非空
* @param obj
* @param trim
* @return
*/
public static boolean isNotEmpty(Object obj, boolean trim) {
return ! isEmpty(obj, trim);
}
/**判断字符是否非空 trim = true
* @param cs
* @return
*/
public static boolean isNotEmpty(CharSequence cs) {
return ! isEmpty(cs);
}
/**判断字符是否非空
* @param cs
* @param trim
* @return
*/
public static boolean isNotEmpty(CharSequence cs, boolean trim) {
return ! isEmpty(cs, trim);
}
/**判断字符是否非空 trim = true
* @param s
* @return
*/
public static boolean isNotEmpty(String s) {
return ! isEmpty(s);
}
/**判断字符是否非空
* @param s
* @param trim
* @return
*/
public static boolean isNotEmpty(String s, boolean trim) {
return ! isEmpty(s, trim);
}
//判断字符是否非空 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//判断字符类型 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
public static final Pattern PATTERN_NUMBER;
public static final Pattern PATTERN_PHONE;
public static final Pattern PATTERN_EMAIL;
public static final Pattern PATTERN_ID_CARD;
public static final Pattern PATTERN_ALPHA;
public static final Pattern PATTERN_PASSWORD; //TODO
public static final Pattern PATTERN_NAME;
public static final Pattern PATTERN_ALPHA_BIG;
public static final Pattern PATTERN_ALPHA_SMALL;
public static final Pattern PATTERN_BRANCH_URL;
static {
PATTERN_NUMBER = Pattern.compile("^[0-9]+$");
PATTERN_ALPHA = Pattern.compile("^[a-zA-Z]+$");
PATTERN_ALPHA_BIG = Pattern.compile("^[A-Z]+$");
PATTERN_ALPHA_SMALL = Pattern.compile("^[a-z]+$");
PATTERN_NAME = Pattern.compile("^[0-9a-zA-Z_]+$");//已用55个中英字符测试通过
//newest phone regex expression reference https://github.com/VincentSit/ChinaMobilePhoneNumberRegex
PATTERN_PHONE = Pattern.compile("^1(?:3\\d{3}|5[^4\\D]\\d{2}|8\\d{3}|7(?:[0-35-9]\\d{2}|4(?:0\\d|1[0-2]|9\\d))|9[0-35-9]\\d{2}|6[2567]\\d{2}|4(?:(?:10|4[01])\\d{3}|[68]\\d{4}|[579]\\d{2}))\\d{6}$");
PATTERN_EMAIL = Pattern.compile("^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$");
PATTERN_ID_CARD = Pattern.compile("(^[1-9]\\d{5}(18|19|([23]\\d))\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$)|(^[1-9]\\d{5}\\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\\d{2}$)");
PATTERN_PASSWORD = Pattern.compile("^[0-9a-zA-Z]+$");
PATTERN_BRANCH_URL = Pattern.compile("^[0-9a-zA-Z-_/]+$");
}
/**判断手机格式是否正确
* @param phone
* @return
*/
public static boolean isPhone(String phone) {
if (isEmpty(phone, true)) {
return false;
}
currentString = phone;
return PATTERN_PHONE.matcher(phone).matches();
}
/**判断手机格式是否正确
* @param s
* @return
*/
public static boolean isPassword(String s) {
return getLength(s, false) >= 6 && PATTERN_PASSWORD.matcher(s).matches();
}
/**判断是否全是数字密码
* @param s
* @return
*/
public static boolean isNumberPassword(String s) {
return getLength(s, false) == 6 && isNumer(s);
}
/**判断email格式是否正确
* @param email
* @return
*/
public static boolean isEmail(String email) {
if (isEmpty(email, true)) {
return false;
}
currentString = email;
return PATTERN_EMAIL.matcher(email).matches();
}
/**判断是否全是验证码
* @param s
* @return
*/
public static boolean isVerify(String s) {
return getLength(s, false) >= 4 && isNumer(s);
}
/**判断是否全是数字
* @param s
* @return
*/
public static boolean isNumer(String s) {
if (isNotEmpty(s, true) == false) {
return false;
}
currentString = s;
return PATTERN_NUMBER.matcher(s).matches();
}
/**判断是否全是字母
* @param s
* @return
*/
public static boolean isAlpha(String s) {
if (isEmpty(s, true)) {
return false;
}
currentString = s;
return PATTERN_ALPHA.matcher(s).matches();
}
/**判断是否全是数字或字母
* @param s
* @return
*/
public static boolean isNumberOrAlpha(String s) {
return isNumer(s) || isAlpha(s);
}
/**判断是否为代码名称,只能包含字母,数字或下划线
* @param s
* @return
*/
public static boolean isName(String s) {
if (s == null || s.isEmpty()) {
return false;
}
String first = s.substring(0, 1);
if (!"_".equals(first) && !PATTERN_ALPHA.matcher(first).matches()) {
return false;
}
return s.length() <= 1 ? true : PATTERN_NAME.matcher(s.substring(1)).matches();
}
/**判断是否为首字母大写的代码名称
* @param s
* @return
*/
public static boolean isBigName(String s) {
if (s == null || s.isEmpty() || PATTERN_ALPHA_BIG.matcher(s.substring(0, 1)).matches() == false) {
return false;
}
return s.length() <= 1 ? true : PATTERN_NAME.matcher(s.substring(1)).matches();
}
/**判断是否为首字母小写的代码名称
* @param s
* @return
*/
public static boolean isSmallName(String s) {
if (s == null || s.isEmpty() || PATTERN_ALPHA_SMALL.matcher(s.substring(0, 1)).matches() == false) {
return false;
}
return s.length() <= 1 ? true : PATTERN_NAME.matcher(s.substring(1)).matches();
}
/**判断字符类型是否是身份证号
* @param number
* @return
*/
public static boolean isIDCard(String number) {
if (isNumberOrAlpha(number) == false) {
return false;
}
number = getString(number);
if (number.length() == 15) {
Log.i(TAG, "isIDCard number.length() == 15 old IDCard");
currentString = number;
return true;
}
if (number.length() == 18) {
currentString = number;
return true;
}
return false;
}
public static final String HTTP = "http";
public static final String URL_PREFIX = "http://";
public static final String URL_PREFIXs = "https://";
public static final String URL_STAFFIX = URL_PREFIX;
public static final String URL_STAFFIXs = URL_PREFIXs;
/**判断字符类型是否是网址
* @param url
* @return
*/
public static boolean isUrl(String url) {
if (isNotEmpty(url, true) == false) {
return false;
}
if (! url.startsWith(URL_PREFIX) && ! url.startsWith(URL_PREFIXs)) {
return false;
}
currentString = url;
return true;
}
public static boolean isBranchUrl(String branchUrl) {
if (isEmpty(branchUrl, false)) {
return false;
}
return PATTERN_BRANCH_URL.matcher(branchUrl).matches();
}
public static final String FILE_PATH_PREFIX = "file://";
/**判断文件路径是否存在
* @param path
* @return
*/
public static boolean isFilePathExist(String path) {
return StringUtil.isFilePath(path) && new File(path).exists();
}
public static final String SEPARATOR = "/";
/**判断是否为路径
* @param path
* @return
*/
public static boolean isPath(String path) {
return StringUtil.isNotEmpty(path, true) && path.contains(SEPARATOR)
&& path.contains(SEPARATOR + SEPARATOR) == false && path.endsWith(SEPARATOR) == false;
}
/**判断字符类型是否是路径
* @param path
* @return
*/
public static boolean isFilePath(String path) {
if (isNotEmpty(path, true) == false) {
return false;
}
if (! path.contains(".") || path.endsWith(".")) {
return false;
}
currentString = path;
return true;
}
//判断字符类型 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//提取特殊字符<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**去掉string内所有非数字类型字符
* @param object
* @return
*/
public static String getNumber(Object object) {
return getNumber(getString(object));
}
/**去掉string内所有非数字类型字符
* @param cs
* @return
*/
public static String getNumber(CharSequence cs) {
return getNumber(getString(cs));
}
/**去掉string内所有非数字类型字符
* @param s
* @return
*/
public static String getNumber(String s) {
return getNumber(s, false);
}
//CS304 Issue link: https://github.com/Tencent/APIJSON/issues/182
/**去掉string内所有非数字类型字符
* @param s -string passed in
* @param onlyStart 中间有非数字时只获取前面的数字
* @return limit String
* Here we replace the simple "+" way of concatenating with Stringbuilder 's append
*/
public static String getNumber(String s, boolean onlyStart) {
if (isNotEmpty(s, true) == false) {
return "";
}
StringBuilder numberString = new StringBuilder("");
String single;
for (int i = 0; i < s.length(); i++) {
single = s.substring(i, i + 1);
if (isNumer(single)) {
numberString.append(single);
} else {
if (onlyStart) {
return numberString.toString();
}
}
}
return numberString.toString();
}
//提取特殊字符>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//校正(自动补全等)字符串<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/**获取网址,自动补全
* @param url
* @return
*/
public static String getCorrectUrl(String url) {
Log.i(TAG, "getCorrectUrl : \n" + url);
if (isNotEmpty(url, true) == false) {
return "";
}
// if (! url.endsWith("/") && ! url.endsWith(".html")) {
// url = url + "/";
// }
if (isUrl(url) == false) {
return URL_PREFIX + url;
}
return url;
}
/**获取去掉所有 空格 、"-" 、"+86" 后的phone
* @param phone
* @return
*/
public static String getCorrectPhone(String phone) {
if (isNotEmpty(phone, true) == false) {
return "";
}
phone = getNoBlankString(phone);
phone = phone.replaceAll("-", "");
if (phone.startsWith("+86")) {
phone = phone.substring(3);
}
return phone;
}
/**获取邮箱,自动补全
* @param email
* @return
*/
public static String getCorrectEmail(String email) {
if (isNotEmpty(email, true) == false) {
return "";
}
email = getNoBlankString(email);
if (isEmail(email) == false && ! email.endsWith(".com")) {
email += ".com";
}
return email;
}
public static final int PRICE_FORMAT_DEFAULT = 0;
public static final int PRICE_FORMAT_PREFIX = 1;
public static final int PRICE_FORMAT_SUFFIX = 2;
public static final int PRICE_FORMAT_PREFIX_WITH_BLANK = 3;
public static final int PRICE_FORMAT_SUFFIX_WITH_BLANK = 4;
public static final String[] PRICE_FORMATS = {
"", "¥", "元", "¥ ", " 元"
};
/**获取价格,保留两位小数
* @param price
* @return
*/
public static String getPrice(String price) {
return getPrice(price, PRICE_FORMAT_DEFAULT);
}
//CS304 Issue link: https://github.com/Tencent/APIJSON/issues/182
/**获取价格,保留两位小数
* @param price -price passed in
* @param formatType 添加单位(元)
* @return limit String
* Here we replace the simple "+" way of concatenating with Stringbuilder 's append
*/
public static String getPrice(String price, int formatType) {
if (isNotEmpty(price, true) == false) {
return getPrice(0, formatType);
}
//单独写到getCorrectPrice? <<<<<<<<<<<<<<<<<<<<<<
String correctPrice;
StringBuilder correctPriceBuilder = new StringBuilder("");
String s;
for (int i = 0; i < price.length(); i++) {
s = price.substring(i, i + 1);
if (".".equals(s) || isNumer(s)) {
correctPriceBuilder.append(s);
}
}
correctPrice = correctPriceBuilder.toString();
//单独写到getCorrectPrice? >>>>>>>>>>>>>>>>>>>>>>
Log.i(TAG, "getPrice <<<<<<<<<<<<<<<<<< correctPrice = " + correctPrice);
if (correctPrice.contains(".")) {
// if (correctPrice.startsWith(".")) {
// correctPrice = 0 + correctPrice;
// }
if (correctPrice.endsWith(".")) {
correctPrice = correctPrice.replaceAll(".", "");
}
}
Log.i(TAG, "getPrice correctPrice = " + correctPrice + " >>>>>>>>>>>>>>>>");
return isNotEmpty(correctPrice, true) ? getPrice(new BigDecimal(0 + correctPrice), formatType) : getPrice(0, formatType);
}
/**获取价格,保留两位小数
* @param price
* @return
*/
public static String getPrice(BigDecimal price) {
return getPrice(price, PRICE_FORMAT_DEFAULT);
}
/**获取价格,保留两位小数
* @param price
* @return
*/
public static String getPrice(double price) {
return getPrice(price, PRICE_FORMAT_DEFAULT);
}
/**获取价格,保留两位小数
* @param price
* @param formatType 添加单位(元)
* @return
*/
public static String getPrice(BigDecimal price, int formatType) {
return getPrice(price == null ? 0 : price.doubleValue(), formatType);
}
/**获取价格,保留两位小数
* @param price
* @param formatType 添加单位(元)
* @return
*/
public static String getPrice(double price, int formatType) {
String s = new DecimalFormat("#########0.00").format(price);
switch (formatType) {
case PRICE_FORMAT_PREFIX:
return PRICE_FORMATS[PRICE_FORMAT_PREFIX] + s;
case PRICE_FORMAT_SUFFIX:
return s + PRICE_FORMATS[PRICE_FORMAT_SUFFIX];
case PRICE_FORMAT_PREFIX_WITH_BLANK:
return PRICE_FORMATS[PRICE_FORMAT_PREFIX_WITH_BLANK] + s;
case PRICE_FORMAT_SUFFIX_WITH_BLANK:
return s + PRICE_FORMATS[PRICE_FORMAT_SUFFIX_WITH_BLANK];
default:
return s;
}
}
/** 数组以指定分隔s拼接
* @param arr
* @param s
* @return
*/
public static String join(String[] arr, String s) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
stringBuilder.append(arr[i]);
if(i>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
public static boolean equals(Object s1, Object s2) {
return Objects.equals(s1, s2);
}
public static boolean equalsIgnoreCase(String s1, String s2) {
if (s1 == s2) {
return true;
}
if (s1 == null || s2 == null) {
return false;
}
return s1.equalsIgnoreCase(s2);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy