package com.mixsmart.utils;
import com.bstek.ureport.console.designer.ReportUtils;
import com.jfirer.baseutil.encrypt.Md5Util;
import com.mixsmart.constant.IMixConstant;
import com.mixsmart.exception.NullArgumentException;
import org.springblade.core.tool.utils.StringPool;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @version 1.0
* @Description:字符串处理工具类
* @author:rock
* @time:2020年4月21日 下午12:05:04
*/
public class StringUtils {
private StringUtils() {
throw new UnsupportedOperationException("StringUtils类无法实例化");
}
private static final String CHARSET_NAME = "UTF-8";
/**
* 判断是否为空
*
* @param value 内容
* @return 为空返回:true;否则返回:false
*/
public static boolean isEmpty(String value) {
return (null == value || value.trim().length() == 0);
}
/**
* @return boolean
* @Description 批量判读为空
* @Param [values]
* @Author yangyj
* @Date 2021.11.05 13:42
**/
public static boolean isEmpty(Object... values) {
for (Object value : values) {
if (!isEmpty(value)) {
return false;
}
}
return true;
}
/**
* 判断是否不为空
*
* @param value 内容
* @return 不为空返回:true;否则返回:false
*/
public static boolean isNotEmpty(String value) {
return !isEmpty(value);
}
/**
* 判断参数;如果参数value
为空;
* 则抛出参数为空异常(运行时异常)
*
* @param value 需要判断的参数
* @param msg 提示信息
*/
public static void isAssert(Object value, String msg) {
msg = isEmpty(msg) ? "提供的参数为空" : msg;
if (null == value) {
throw new NullArgumentException(msg);
}
if (value instanceof String) {
if (isEmpty(value.toString())) {
throw new NullArgumentException(msg);
}
} else if (value instanceof Collection) {
if (CollectionUtils.isEmpty((Collection>) value)) {
throw new NullArgumentException(msg);
}
} else if (value.getClass().isArray()) {
if (ArrayUtils.isEmpty((Object[]) value)) {
throw new NullArgumentException(msg);
}
}
}
/**
* 判断值是否相等
*
* @param value1
* @param value2
* @return 相等返回:true;否则返回:false
*/
public static boolean isEquals(Object value1, Object value2) {
boolean is = false;
if (null != value1 && null != value2) {
is = value1.toString().equals(value2.toString());
} else if (null == value1 && null == value2) {
is = true;
}
return is;
}
/**
* 判断值是否不相等
*
* @param value1
* @param value2
* @return 相等返回:true;否则返回:false
*/
public static boolean isNotEquals(Object value1, Object value2) {
return !isEquals(value1, value2);
}
/**
* 判断值是否相等(不区分大小写)
*
* @param value1
* @param value2
* @return 相等返回:true;否则返回:false
*/
public static boolean isEqualsIgnoreCase(Object value1, Object value2) {
boolean is = false;
if (null != value1 && null != value1) {
is = value1.toString().equalsIgnoreCase(value2.toString());
} else if (null == value1 && null == value1) {
is = true;
}
return is;
}
/**
* 判断值是否不相等(不区分大小写)
*
* @param value1
* @param value2
* @return 相等返回:true;否则返回:false
*/
public static boolean isNotEqualsIgnoreCase(Object value1, Object value2) {
return !isEqualsIgnoreCase(value1, value2);
}
/**
* null转换为“”
*
* @param obj
* @return 返回处理后的结果
*/
public static String handleNull(Object obj) {
if (null == obj) {
return "";
} else {
return obj.toString().trim();
}
}
/**
* 当值为null转化为“null”
*
* @param obj
* @return 返回处理后的结果
*/
public static String nullToStr(Object obj) {
if (null == obj) {
return "null";
} else {
return obj.toString().trim();
}
}
/**
* 对象转化为整型
*
注:该方法已过时,请用{@link #handleObj2Integer(Object)} 代替
* * @param obj * @return 返回转化结果 */ public static Integer handObj2Integer(Object obj) { return handleObj2Integer(obj); } /** * 对象转化为整型 * * @param obj * @return 返回转化结果 */ public static Integer handleObj2Integer(Object obj) { if (null == obj) { return 0; } else { double value = 0; try { value = Double.parseDouble(obj.toString()); } catch (Exception ex) { value = 0; } return (int) value; } } /** * @return java.lang.Double * @Description 对象转Double * @Param [obj, scale] * @Author yangyj * @Date 2022.04.20 14:15 **/ public static Double obj2Double(Object obj, Object scale) { if (StringUtils.isNumber(obj)) { if (StringUtils.isNumber(scale)) { obj = new BigDecimal(StringUtils.number2String(obj, scale)); } BigDecimal big = new BigDecimal(obj.toString()); return big.doubleValue(); } return null; } public static Double obj2Double(Object obj) { return obj2Double(obj, null); } /** * 数字null转换为“0” * * @param obj * @return 返回转化结果 */ public static String handleNumNull(Object obj) { if (null == obj) { return "0"; } else { return obj.toString().trim(); } } /** * 判断是否为数字(包括小数) * * @param value * @return 数字返回:true;否则返回:false */ public static boolean isNum(Object value) { boolean is = false; if (value != null) { Pattern pattern = Pattern.compile("\\d+|\\d+\\.\\d+"); Matcher matcher = pattern.matcher(value.toString()); if (matcher.matches()) { is = true; } else { is = false; } } return is; } /** * 判断是否数字整数 * * @param value * @return 是返回:true;否则返回:false */ public static boolean isInteger(String value) { boolean is = false; Pattern pattern = Pattern.compile("\\d+"); if (null != value && value.length() > 1) { pattern = Pattern.compile("^[1-9]\\d+"); } Matcher matcher = pattern.matcher(value); if (matcher.matches()) { is = true; } else { is = false; } return is; } /** * 判断是否小数 * * @param value * @return 是返回:true;否则返回:false */ public static boolean isDecimal(String value) { boolean is = false; Pattern pattern = Pattern.compile("\\d+\\.\\d+"); Matcher matcher = pattern.matcher(value); if (matcher.matches()) { is = true; } else { is = false; } return is; } /** * 随机生成数 * * @param num 要生成随机数的个数 * @return 返回随机生成数 */ public static String randomNum(int num) { Random random = new Random(); String numStr = ""; for (int i = 0; i < num; i++) { numStr += random.nextInt(10); } return numStr; } /** * 按日期格式生成序列号 * * @param dateFormaterStr 日期格式 * @return 返回序列号 */ public static String createSerialNum(String dateFormaterStr) { String serialNum = null; if (isNotEmpty(dateFormaterStr)) { SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormaterStr); serialNum = dateFormatter.format(new Date()); dateFormatter = null; } return serialNum; } /** * 生成UUID序列号 * * @return 返回UUID */ public static String uuid() { String value = UUID.randomUUID().toString(); value = value.replaceAll("-", ""); return value.substring(0, 28); } public static String uuid(int max) { String value = UUID.randomUUID().toString(); value = value.replaceAll("-", ""); return value.substring(0, max); } /** * 获取文件后缀 * * @param fileName * @return 返回文件后缀 */ public static String getFileSuffix(String fileName) { int index = fileName.lastIndexOf("."); if (index != -1) { return fileName.substring(index + 1); } return ""; } /** * 去掉文件后缀 * * @param fileName * @return 返回文件后缀 */ public static String trimFileSuffix(String fileName) { return fileName.substring(0, fileName.lastIndexOf(".")); } /** * 验证手机号码 * * @param phoneNo * @return 验证成功返回:true;否则返回:false */ public static boolean isPhoneNO(String phoneNo) { Pattern p = Pattern.compile("^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$"); Matcher m = p.matcher(phoneNo); return m.matches(); } /** * 验证固定电话号码 * * @param tel * @return 验证成功返回:true;否则返回:false */ public static boolean isFixedTelephone(String tel) { Pattern p = Pattern.compile("^[0][0-9]{2,3}-[2-9][0-9]{6,7}(-[0-9]{1,4})?"); Matcher m = p.matcher(tel); return m.matches(); } /** * 验证匿名 * * @param anonymous * @return 验证成功返回:true;否则返回:false */ public static boolean isAnonymous(String anonymous) { Pattern p = Pattern.compile("^[\\u4e00-\\u9fa5|A-Za-z]([\\w|\\u4e00-\\u9fa5]){1,7}$"); Matcher m = p.matcher(anonymous); return m.matches(); } /** * 验证汉字 * * @param value * @return 验证成功返回:true;否则返回:false */ public static boolean isChinese(String value) { Pattern p = Pattern.compile("^[\\u4E00-\\u9FFF]+$"); Matcher m = p.matcher(value); boolean is = m.matches(); return is; } /** * 验证正则表达式 * * @param value * @return 验证成功返回:true;否则返回:false */ public static boolean isCheckRegex(String value, String regex) { Pattern p = Pattern.compile(regex); Matcher m = p.matcher(value); boolean is = m.matches(); return is; } /** * 验证QQ号码 * * @param value * @return 验证成功返回:true;否则返回:false */ public static boolean isQQ(String value) { Pattern p = Pattern.compile("^[1-9]\\d{6,11}$"); Matcher m = p.matcher(value); return m.matches(); } /** * 验证email * * @param email * @return 验证成功返回:true;否则返回:false */ public static boolean isEmail(String email) { Pattern p = Pattern.compile("^([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$"); Matcher m = p.matcher(email); return m.matches(); } /** * 秒转化为:HH:mm:SS格式 * * @param second * @return 返回转化后的结果 */ public static String secondToHHMMSS(long second) { long h = 0, m = 0, s = 0, tmp = 0; if (second >= 3600) { h = second / 3600; tmp = second % 36000; if (tmp >= 60) { m = tmp / 60; s = tmp % 60; } else { s = tmp; } } else if (second >= 60) { m = second / 60; s = second % 60; } else { s = second; } return (h > 9 ? h : "0" + h) + ":" + (m > 9 ? m : "0" + m) + ":" + (s > 9 ? s : "0" + s); } /** * 过滤特殊字符 * * @param params * @return 返回过滤后的结果 */ public static String filterSQLParams(String params) { if (!isEmpty(params)) { StringBuilder strBuilder = new StringBuilder(); strBuilder.append("'|\"|update|delete|select|drop|insert|=|;|0x|\\(|\\)|\\s|\\*|\\?|\\%|\\$"); strBuilder.append("|and|exec|execute|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|or"); strBuilder.append("|\\+|,|like'|table|from|grant|use|group_concat|column_name|information_schema.columns"); strBuilder.append("|table_schema|union|where|order|by|count"); strBuilder.append("|--|,|like|//|/|#"); String params1 = params.toLowerCase(); params1 = params1.replaceAll(strBuilder.toString(), ""); if ("".equals(params1) && !"''".equals(params)) { params = params1; } params = params.replaceAll("&", "&"); params = params.replaceAll("<", "<"); params = params.replaceAll(">", ">"); } return params; } /** * 根据regex分隔字符串 * 然后用逗号","重组 * * @param ids * @param regex * @return 返回处理后的结果 */ public static String splitIds(String ids, String regex) { String newIds = ""; if (isNotEmpty(ids)) { String[] idsArr = ids.split(regex); for (int i = 0; i < idsArr.length; i++) { if (i != (idsArr.length - 1)) { newIds += "'" + idsArr[i] + "',"; } else { newIds += "'" + idsArr[i] + "'"; } } } return newIds; } /** * 计算出文件大小 * * @param size * @return 返回处理后的结果;separate
为空,则采用默认值;默认值为:{@link IMixConstant#MULTI_VALUE_SPLIT}
*
* @param objs 数组
* @param separate 分隔符
* @return 返回数组转化成功后的字符串;失败返回:null
*/
public static String arrayToString(Object[] objs, String separate) {
StringBuilder strBuff = null;
if (null == objs || objs.length == 0) {
return null;
}
if (StringUtils.isEmpty(separate)) {
separate = IMixConstant.MULTI_VALUE_SPLIT;
}
strBuff = new StringBuilder();
for (int i = 0; i < objs.length; i++) {
if (i < objs.length - 1) {
strBuff.append(String.valueOf(objs[i]) + separate);
} else {
strBuff.append(String.valueOf(objs[i]));
}
}//for
objs = null;
return (null != strBuff) ? strBuff.toString() : null;
}
/**
* 字符串转化为数组;
* 如果separate
为空,则采用默认值;默认值为:{@link IMixConstant#MULTI_VALUE_SPLIT}
*
* @param value 原字符串
* @param separate 分隔符
* @return 返回字符串分割成功后的数组
*/
public static String[] stringToArray(String value, String separate) {
String[] array = null;
if (isEmpty(separate)) {
separate = IMixConstant.MULTI_VALUE_SPLIT;
}
if (isNotEmpty(value)) {
array = value.split(separate);
}
value = null;
return array;
}
/**
* 按separate分离成数组,判断该数组里面是否包含subStr;
* 如果separate
为空,则采用默认值;默认值为:{@link IMixConstant#MULTI_VALUE_SPLIT}
*
* @param str 字符串
* @param subStr 子字符串
* @param separate 分隔符
* @return 包含返回:true;否则返回:false
*/
public static boolean isArrayContains(String str, String subStr, String separate) {
if (isEmpty(str)) {
return isEmpty(subStr);
}
if (null == subStr) {
return true;
}
boolean is = false;
if (isEmpty(separate)) {
separate = IMixConstant.MULTI_VALUE_SPLIT;
}
String[] strArray = str.split(separate);
for (int i = 0; i < strArray.length; i++) {
if (subStr.equals(strArray[i].trim())) {
is = true;
break;
}
}//for
return is;
}
/**
* 判断对象是否为空,或转换为字符串后的值是否为空
*
* @param value 需要判断的值
* @return 为空(null或“”)返回true;否则返回false
*/
public static boolean isEmpty(Object value) {
if (null == value) {
return true;
} else {
return isEmpty(handleNull(value));
}
}
/**
* 判断对象是否不为空;
*
* @param value 需要判断的值
* @return 如果不为空返回true;否则返回false
*/
public static boolean isNotEmpty(Object value) {
return !isEmpty(value);
}
/**
* @return boolean
* @Description 批量非空校验
* @Param [values]
* @Author yangyj
* @Date 2021.10.19 17:04
**/
public static boolean isNotEmpty(Object... values) {
for (Object value : values) {
if (isEmpty(value)) {
return false;
}
}
return true;
}
/**
* @Description 是否数字
* @Param [value]
* @return boolean
* @Author yangyj
* @Date 2022.06.02 14:54
**/
public static boolean isNumber(Object value) {
if (isEmpty(value)) {
return false;
}
if (value instanceof Number) {
return true;
}
String pattern = "^[+-]?\\d+(\\.[\\dEe]+)?$";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(String.valueOf(value));
return m.matches();
}
public static boolean isDouble(Object value) {
return isNumber(value) && value.toString().contains(".");
}
/**
* @return java.util.Map