package com.xiaoleilu.hutool;
import java.math.BigDecimal;
import java.util.Set;
import com.xiaoleilu.hutool.exceptions.UtilException;
/**
* 类型转换器
*
* @author xiaoleilu
*
*/
public class Conver {
/**
* 转换为字符串<br>
* 如果给定的值为null,或者转换失败,返回默认值<br>
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static String toStr(Object value, String defaultValue) {
if(null == value) {
return defaultValue;
}
if(value instanceof String) {
return (String)value;
}
return value.toString();
}
/**
* 转换为int<br>
* 如果给定的值为空,或者转换失败,返回默认值<br>
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Integer toInt(Object value, Integer defaultValue) {
if (value == null) return defaultValue;
if(value instanceof Integer) {
return (Integer)value;
}
final String valueStr = value.toString();
if (StrUtil.isBlank(valueStr)) return defaultValue;
try {
return Integer.parseInt(valueStr);
} catch (Exception e) {
return defaultValue;
}
}
/**
* 转换为Integer数组<br>
* @param <T>
* @param isIgnoreConvertError 是否忽略转换错误,忽略则给值null
* @param values 被转换的值
* @return 结果
*/
@SafeVarargs
public static <T> Integer[] toIntArray(boolean isIgnoreConvertError, T... values) {
if(CollectionUtil.isEmpty(values)) {
return null;
}
final Integer[] ints = new Integer[values.length];
for(int i = 0; i < values.length; i++) {
final Integer v = toInt(values[i], null);
if(null == v && isIgnoreConvertError == false) {
throw new UtilException(StrUtil.format("Convert [{}] to Integer error!", values[i]));
}
ints[i] = v;
}
return ints;
}
/**
* 转换为long<br>
* 如果给定的值为空,或者转换失败,返回默认值<br>
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Long toLong(Object value, Long defaultValue) {
if (value == null) return defaultValue;
if(value instanceof Long) {
return (Long)value;
}
final String valueStr = value.toString();
if (StrUtil.isBlank(valueStr)) return defaultValue;
try {
return new BigDecimal(valueStr).longValue();
} catch (Exception e) {
return defaultValue;
}
}
/**
* 转换为Long数组<br>
* @param <T>
* @param isIgnoreConvertError 是否忽略转换错误,忽略则给值null
* @param values 被转换的值
* @return 结果
*/
@SafeVarargs
public static <T> Long[] toLongArray(boolean isIgnoreConvertError, T... values) {
if(CollectionUtil.isEmpty(values)) {
return null;
}
final Long[] longs = new Long[values.length];
for(int i = 0; i < values.length; i++) {
final Long v = toLong(values[i], null);
if(null == v && isIgnoreConvertError == false) {
throw new UtilException(StrUtil.format("Convert [{}] to Long error!", values[i]));
}
longs[i] = v;
}
return longs;
}
/**
* 转换为double<br>
* 如果给定的值为空,或者转换失败,返回默认值<br>
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Double toDouble(Object value, Double defaultValue) {
if (value == null) return defaultValue;
if(value instanceof Double) {
return (Double)value;
}
final String valueStr = value.toString();
if (StrUtil.isBlank(valueStr)) return defaultValue;
try {
return new BigDecimal(valueStr).doubleValue();
} catch (Exception e) {
return defaultValue;
}
}
/**
* 转换为Double数组<br>
* @param <T>
* @param isIgnoreConvertError 是否忽略转换错误,忽略则给值null
* @param values 被转换的值
* @return 结果
*/
@SafeVarargs
public static <T> Double[] toDoubleArray(boolean isIgnoreConvertError, T... values) {
if(CollectionUtil.isEmpty(values)) {
return null;
}
final Double[] doubles = new Double[values.length];
for(int i = 0; i < values.length; i++) {
final Double v = toDouble(values[i], null);
if(null == v && isIgnoreConvertError == false) {
throw new UtilException(StrUtil.format("Convert [{}] to Double error!", values[i]));
}
doubles[i] = v;
}
return doubles;
}
/**
* 转换为Float<br>
* 如果给定的值为空,或者转换失败,返回默认值<br>
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Float toFloat(Object value, Float defaultValue) {
if (value == null) return defaultValue;
if(value instanceof Float) {
return (Float)value;
}
final String valueStr = value.toString();
if (StrUtil.isBlank(valueStr)) return defaultValue;
try {
return Float.parseFloat(valueStr);
} catch (Exception e) {
return defaultValue;
}
}
/**
* 转换为Float数组<br>
* @param <T>
* @param isIgnoreConvertError 是否忽略转换错误,忽略则给值null
* @param values 被转换的值
* @return 结果
*/
@SafeVarargs
public static <T> Float[] toFloatArray(boolean isIgnoreConvertError, T... values) {
if(CollectionUtil.isEmpty(values)) {
return null;
}
final Float[] floats = new Float[values.length];
for(int i = 0; i < values.length; i++) {
final Float v = toFloat(values[i], null);
if(null == v && isIgnoreConvertError == false) {
throw new UtilException(StrUtil.format("Convert [{}] to Float error!", values[i]));
}
floats[i] = v;
}
return floats;
}
/**
* 转换为boolean<br>
* 如果给定的值为空,或者转换失败,返回默认值<br>
* 转换失败不会报错
*
* @param value 被转换的值
* @param defaultValue 转换错误时的默认值
* @return 结果
*/
public static Boolean toBool(Object value, Boolean defaultValue) {
if (value == null) return defaultValue;
if(value instanceof Boolean) {
return (Boolean)value;
}
final String valueStr = value.toString();
if (StrUtil.isBlank(valueStr)) return defaultValue;
try {
return Boolean.parseBoolean(valueStr);
} catch (Exception e) {
return defaultValue;
}
}
/**
* 转换为Boolean数组<br>
* @param <T>
* @param isIgnoreConvertError 是否忽略转换错误,忽略则给值null
* @param values 被转换的值
* @return 结果
*/
@SafeVarargs
public static <T> Boolean[] toBooleanArray(boolean isIgnoreConvertError, T... values) {
if(CollectionUtil.isEmpty(values)) {
return null;
}
final Boolean[] bools = new Boolean[values.length];
for(int i = 0; i < values.length; i++) {
final Boolean v = toBool(values[i], null);
if(null == v && isIgnoreConvertError == false) {
throw new UtilException(StrUtil.format("Convert [{}] to Boolean error!", values[i]));
}
bools[i] = v;
}
return bools;
}
// ----------------------------------------------------------------------- 全角半角转换
/**
* 半角转全角
*
* @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<Character> 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<Character> 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] = ' ';
} else if (c[i] > '\uFF00' && c[i] < '\uFF5F') {
c[i] = (char) (c[i] - 65248);
}
}
String returnString = new String(c);
return returnString;
}
}