com.xiaoleilu.hutool.convert.Convert Maven / Gradle / Ivy
package com.xiaoleilu.hutool.convert;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import com.xiaoleilu.hutool.convert.impl.CollectionConverter;
import com.xiaoleilu.hutool.convert.impl.EnumConverter;
import com.xiaoleilu.hutool.lang.Assert;
import com.xiaoleilu.hutool.util.CharsetUtil;
import com.xiaoleilu.hutool.util.HexUtil;
import com.xiaoleilu.hutool.util.StrUtil;
/**
* 类型转换器
*
* @author xiaoleilu
*
*/
public final class Convert {
/**
* 转换为字符串
* 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static String toStr(Object value, String defaultValue) {
return convert(String.class, value, defaultValue);
}
/**
* 转换为字符串
* 如果给定的值为null
,或者转换失败,返回默认值null
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static String toStr(Object value) {
return toStr(value, null);
}
/**
* 转换为String数组
*
* @param value 被转换的值
* @return String数组
* @since 3.2.0
*/
public static String[] toStrArray(Object value) {
return convert(String[].class, value);
}
/**
* 转换为字符
* 如果给定的值为null,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Character toChar(Object value, Character defaultValue) {
return convert(Character.class, value, defaultValue);
}
/**
* 转换为字符
* 如果给定的值为null
,或者转换失败,返回默认值null
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static Character toChar(Object value) {
return toChar(value, null);
}
/**
* 转换为Character数组
*
* @param value 被转换的值
* @return Character数组
* @since 3.2.0
*/
public static Character[] toCharArray(Object value) {
return convert(Character[].class, value);
}
/**
* 转换为byte
* 如果给定的值为null
,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Byte toByte(Object value, Byte defaultValue) {
return convert(Byte.class, value, defaultValue);
}
/**
* 转换为byte
* 如果给定的值为null
,或者转换失败,返回默认值null
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static Byte toByte(Object value) {
return toByte(value, null);
}
/**
* 转换为Byte数组
*
* @param value 被转换的值
* @return Byte数组
* @since 3.2.0
*/
public static Byte[] toByteArray(Object value) {
return convert(Byte[].class, value);
}
/**
* 转换为Short
* 如果给定的值为null
,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Short toShort(Object value, Short defaultValue) {
return convert(Short.class, value, defaultValue);
}
/**
* 转换为Short
* 如果给定的值为null
,或者转换失败,返回默认值null
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static Short toShort(Object value) {
return toShort(value, null);
}
/**
* 转换为Short数组
*
* @param value 被转换的值
* @return Short数组
* @since 3.2.0
*/
public static Short[] toShortArray(Object value) {
return convert(Short[].class, value);
}
/**
* 转换为Number
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Number toNumber(Object value, Number defaultValue) {
return convert(Number.class, value, defaultValue);
}
/**
* 转换为Number
* 如果给定的值为空,或者转换失败,返回默认值null
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static Number toNumber(Object value) {
return toNumber(value, null);
}
/**
* 转换为Number数组
*
* @param value 被转换的值
* @return Number数组
* @since 3.2.0
*/
public static Number[] toNumberArray(Object value) {
return convert(Number[].class, value);
}
/**
* 转换为int
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Integer toInt(Object value, Integer defaultValue) {
return convert(Integer.class, value, defaultValue);
}
/**
* 转换为int
* 如果给定的值为null
,或者转换失败,返回默认值null
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static Integer toInt(Object value) {
return toInt(value, null);
}
/**
* 转换为Integer数组
*
* @param value 被转换的值
* @return 结果
*/
public static Integer[] toIntArray(Object value) {
return convert(Integer[].class, value);
}
/**
* 转换为long
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Long toLong(Object value, Long defaultValue) {
return convert(Long.class, value, defaultValue);
}
/**
* 转换为long
* 如果给定的值为null
,或者转换失败,返回默认值null
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static Long toLong(Object value) {
return toLong(value, null);
}
/**
* 转换为Long数组
*
* @param value 被转换的值
* @return 结果
*/
public static Long[] toLongArray(Object value) {
return convert(Long[].class, value);
}
/**
* 转换为double
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Double toDouble(Object value, Double defaultValue) {
return convert(Double.class, value, defaultValue);
}
/**
* 转换为double
* 如果给定的值为空,或者转换失败,返回默认值null
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static Double toDouble(Object value) {
return toDouble(value, null);
}
/**
* 转换为Double数组
*
* @param value 被转换的值
* @return 结果
*/
public static Double[] toDoubleArray(Object value) {
return convert(Double[].class, value);
}
/**
* 转换为Float
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Float toFloat(Object value, Float defaultValue) {
return convert(Float.class, value, defaultValue);
}
/**
* 转换为Float
* 如果给定的值为空,或者转换失败,返回默认值null
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static Float toFloat(Object value) {
return toFloat(value, null);
}
/**
* 转换为Float数组
*
* @param value 被转换的值
* @return 结果
*/
public static Float[] toFloatArray(Object value) {
return convert(Float[].class, value);
}
/**
* 转换为boolean
* String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Boolean toBool(Object value, Boolean defaultValue) {
return convert(Boolean.class, value, defaultValue);
}
/**
* 转换为boolean
* 如果给定的值为空,或者转换失败,返回默认值null
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static Boolean toBool(Object value) {
return toBool(value, null);
}
/**
* 转换为Boolean数组
*
* @param value 被转换的值
* @return 结果
*/
public static Boolean[] toBooleanArray(Object value) {
return convert(Boolean[].class, value);
}
/**
* 转换为BigInteger
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static BigInteger toBigInteger(Object value, BigInteger defaultValue) {
return convert(BigInteger.class, value, defaultValue);
}
/**
* 转换为BigInteger
* 如果给定的值为空,或者转换失败,返回默认值null
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static BigInteger toBigInteger(Object value) {
return toBigInteger(value, null);
}
/**
* 转换为BigDecimal
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) {
return convert(BigDecimal.class, value, defaultValue);
}
/**
* 转换为BigDecimal
* 如果给定的值为空,或者转换失败,返回默认值
* 转换失败不会报错
*
* @param value 被转换的值
* @return 结果
*/
public static BigDecimal toBigDecimal(Object value) {
return toBigDecimal(value, null);
}
/**
* 转换为Enum对象
* 如果给定的值为空,或者转换失败,返回默认值
*
* @param 枚举类型
* @param clazz Enum的Class
* @param value 值
* @param defaultValue 默认值
* @return Enum
*/
public static > E toEnum(Class clazz, Object value, E defaultValue) {
return (new EnumConverter<>(clazz)).convert(value, defaultValue);
}
/**
* 转换为Enum对象
* 如果给定的值为空,或者转换失败,返回默认值null
*
* @param 枚举类型
* @param clazz Enum的Class
* @param value 值
* @return Enum
*/
public static > E toEnum(Class clazz, Object value) {
return toEnum(clazz, value, null);
}
/**
* 转换为集合类
*
* @param collectionType 集合类型
* @param elementType 集合中元素类型
* @param value 被转换的值
* @return {@link Collection}
* @since 3.0.8
*/
public static Collection> toCollection(Class> collectionType, Class> elementType, Object value) {
return new CollectionConverter(collectionType, elementType).convert(value, null);
}
/**
* 转换值为指定类型
*
* @param 目标类型
* @param type 类型
* @param value 值
* @return 转换后的值
*/
public static T convert(Type type, Object value) {
return convert(type, value, null);
}
/**
* 转换值为指定类型
*
* @param 目标类型
* @param type 类型
* @param value 值
* @param defaultValue 默认值
* @return 转换后的值
* @throws ConvertException 转换器不存在
*/
public static T convert(Type type, Object value, T defaultValue) throws ConvertException {
return ConverterRegistry.getInstance().convert(type, value, defaultValue);
}
// ----------------------------------------------------------------------- 全角半角转换
/**
* 半角转全角
*
* @param input String.
* @return 全角字符串.
*/
public static String toSBC(String input) {
return toSBC(input, null);
}
/**
* 半角转全角
*
* @param input String
* @param notConvertSet 不替换的字符集合
* @return 全角字符串.
*/
public static String toSBC(String input, Set notConvertSet) {
char c[] = input.toCharArray();
for (int i = 0; i < c.length; i++) {
if (null != notConvertSet && notConvertSet.contains(c[i])) {
// 跳过不替换的字符
continue;
}
if (c[i] == ' ') {
c[i] = '\u3000';
} else if (c[i] < '\177') {
c[i] = (char) (c[i] + 65248);
}
}
return new String(c);
}
/**
* 全角转半角
*
* @param input String.
* @return 半角字符串
*/
public static String toDBC(String input) {
return toDBC(input, null);
}
/**
* 替换全角为半角
*
* @param text 文本
* @param notConvertSet 不替换的字符集合
* @return 替换后的字符
*/
public static String toDBC(String text, Set notConvertSet) {
char c[] = text.toCharArray();
for (int i = 0; i < c.length; i++) {
if (null != notConvertSet && notConvertSet.contains(c[i])) {
// 跳过不替换的字符
continue;
}
if (c[i] == '\u3000' || c[i] == '\u00a0' || c[i] == '\u2007' || c[i] == '\u202F') {
// \u3000是中文全角空格,\u00a0、\u2007、\u202F是不间断空格
c[i] = ' ';
} else if (c[i] > '\uFF00' && c[i] < '\uFF5F') {
c[i] = (char) (c[i] - 65248);
}
}
String returnString = new String(c);
return returnString;
}
// --------------------------------------------------------------------- hex
/**
* 字符串转换成十六进制字符串,结果为小写
*
* @param str 待转换的ASCII字符串
* @param charset 编码
* @return 16进制字符串
* @see HexUtil#encodeHexStr(String, Charset)
*/
public static String toHex(String str, Charset charset) {
return HexUtil.encodeHexStr(str, charset);
}
/**
* byte数组转16进制串
*
* @param bytes 被转换的byte数组
* @return 转换后的值
* @see HexUtil#encodeHexStr(byte[])
*/
public static String toHex(byte[] bytes) {
return HexUtil.encodeHexStr(bytes);
}
/**
* Hex字符串转换为Byte值
*
* @param src Byte字符串,每个Byte之间没有分隔符
* @return byte[]
* @see HexUtil#decodeHex(char[])
*/
public static byte[] hexToBytes(String src) {
return HexUtil.decodeHex(src.toCharArray());
}
/**
* 十六进制转换字符串
*
* @param hexStr Byte字符串(Byte之间无分隔符 如:[616C6B])
* @param charset 编码 {@link Charset}
* @return 对应的字符串
* @see HexUtil#decodeHexStr(String, Charset)
*/
public static String hexStrToStr(String hexStr, Charset charset) {
return HexUtil.decodeHexStr(hexStr, charset);
}
/**
* String的字符串转换成unicode的String
*
* @param strText 全角字符串
* @return String 每个unicode之间无分隔符
*/
public static String strToUnicode(String strText) {
int strLength = strText.length();
final StringBuilder str = new StringBuilder(strLength * 6);
String strHex;
int strHexLen;
for (int i = 0; i < strLength; i++) {
strHex = Integer.toHexString(strText.charAt(i));
strHexLen = strHex.length();
str.append("\\u");
// 对不够4位的在前补零
if (strHexLen > 0 && strHexLen < 4) {
str.append(StrUtil.repeat('0', 4 - strHexLen));
}
str.append(strHex);
}
return str.toString();
}
/**
* unicode的String转换成String的字符串
*
* @param unicode Unicode符
* @return String 字符串
*/
public static String unicodeToStr(String unicode) {
StringBuffer string = new StringBuffer();
String[] hex = StrUtil.split(unicode, "\\u");
for (int i = 1; i < hex.length; i++) {
// 转换出每一个代码点
int data = Integer.parseInt(hex[i], 16);
// 追加成string
string.append((char) data);
}
return string.toString();
}
/**
* 给定字符串转换字符编码
* 如果参数为空,则返回原字符串,不报错。
*
* @param str 被转码的字符串
* @param sourceCharset 原字符集
* @param destCharset 目标字符集
* @return 转换后的字符串
* @see CharsetUtil#convert(String, String, String)
*/
public static String convertCharset(String str, String sourceCharset, String destCharset) {
if (StrUtil.hasBlank(str, sourceCharset, destCharset)) {
return str;
}
return CharsetUtil.convert(str, sourceCharset, destCharset);
}
/**
* 转换时间单位
*
* @param sourceDuration 时长
* @param sourceUnit 源单位
* @param destUnit 目标单位
* @return 目标单位的时长
*/
public static long convertTime(long sourceDuration, TimeUnit sourceUnit, TimeUnit destUnit) {
Assert.notNull(sourceUnit, "sourceUnit is null !");
Assert.notNull(destUnit, "destUnit is null !");
return destUnit.convert(sourceDuration, sourceUnit);
}
// --------------------------------------------------------------- 原始包装类型转换
/**
* 原始类转为包装类,非原始类返回原类
*
* @see BasicType#wrap(Class)
* @param clazz 原始类
* @return 包装类
*/
public static Class> wrap(Class> clazz) {
return BasicType.wrap(clazz);
}
/**
* 包装类转为原始类,非包装类返回原类
*
* @see BasicType#unWrap(Class)
* @param clazz 包装类
* @return 原始类
*/
public static Class> unWrap(Class> clazz) {
return BasicType.unWrap(clazz);
}
// -------------------------------------------------------------------------- 数字和英文转换
/**
* 将阿拉伯数字转为英文表达方式
*
* @param number {@link Number}对象
* @return 英文表达式
* @since 3.0.9
*/
public static String numberToWord(Number number) {
return NumberWordFormater.format(number);
}
/**
* 将阿拉伯数字转为中文表达方式
*
* @param number 数字
* @param isUseTraditonal 是否使用繁体字(金额形式)
* @return 中文
* @since 3.2.3
*/
public static String numberToChinese(double number, boolean isUseTraditonal) {
return NumberChineseFormater.format(number, isUseTraditonal);
}
/**
* 金额转为中文形式
*
* @param n 数字
* @return 中文大写数字
* @since 3.2.3
*/
public static String digitToChinese(Number n) {
if(null == n) {
return "零";
}
return NumberChineseFormater.format(n.doubleValue(), true, true);
}
// -------------------------------------------------------------------------- 数字转换
/**
* int转byte
*
* @param intValue int值
* @return byte值
* @since 3.2.0
*/
public static byte intToByte(int intValue) {
return (byte) intValue;
}
/**
* byte转无符号int
*
* @param byteValue byte值
* @return 无符号int值
* @since 3.2.0
*/
public static int byteToUnsignedInt(byte byteValue) {
// Java 总是把 byte 当做有符处理;我们可以通过将其和 0xFF 进行二进制与得到它的无符值
return byteValue & 0xFF;
}
/**
* byte数组转short
*
* @param bytes byte数组
* @return short值
* @since 3.2.0
*/
public static short bytesToShort(byte[] bytes) {
return (short) (bytes[1] & 0xff | (bytes[0] & 0xff) << 8);
}
/**
* short转byte数组
* @param shortValue short值
* @return byte数组
* @since 3.2.0
*/
public static byte[] shortToBytes(short shortValue) {
byte[] b = new byte[2];
b[1] = (byte) (shortValue & 0xff);
b[0] = (byte) ((shortValue >> 8) & 0xff);
return b;
}
/**
* byte[]转int值
*
* @param bytes byte数组
* @return int值
* @since 3.2.0
*/
public static int bytesToInt(byte[] bytes) {
return bytes[3] & 0xFF | //
(bytes[2] & 0xFF) << 8 | //
(bytes[1] & 0xFF) << 16 | //
(bytes[0] & 0xFF) << 24; //
}
/**
* int转byte数组
*
* @param intValue int值
* @return byte数组
* @since 3.2.0
*/
public static byte[] intToBytes(int intValue) {
return new byte[] { //
(byte) ((intValue >> 24) & 0xFF), //
(byte) ((intValue >> 16) & 0xFF), //
(byte) ((intValue >> 8) & 0xFF), //
(byte) (intValue & 0xFF) //
};
}
/**
* long转byte数组
* from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java
*
* @param longValue long值
* @return byte数组
* @since 3.2.0
*/
public static byte[] longToBytes(long longValue) {
// Magic number 8 should be defined as Long.SIZE / Byte.SIZE
final byte[] result = new byte[8];
for (int i = 7; i >= 0; i--) {
result[i] = (byte) (longValue & 0xFF);
longValue >>= 8;
}
return result;
}
/**
* byte数组转long
* from: https://stackoverflow.com/questions/4485128/how-do-i-convert-long-to-byte-and-back-in-java
*
* @param bytes byte数组
* @return long值
* @since 3.2.0
*/
public static long bytesToLong(byte[] bytes) {
// Magic number 8 should be defined as Long.SIZE / Byte.SIZE
long values = 0;
for (int i = 0; i < 8; i++) {
values <<= 8;
values |= (bytes[i] & 0xff);
}
return values;
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy