修复NumberWithFormat导致转换Long异常问题

This commit is contained in:
Looly
2023-03-08 22:40:56 +08:00
parent 11e3d7acf2
commit 3d10a39ea3
6 changed files with 51 additions and 25 deletions

View File

@@ -14,6 +14,7 @@ import java.util.Date;
* @since 5.8.13
*/
public class NumberWithFormat extends Number implements TypeConverter{
private static final long serialVersionUID = 1L;
private final Number number;
private final String format;
@@ -31,7 +32,8 @@ public class NumberWithFormat extends Number implements TypeConverter{
@SuppressWarnings("unchecked")
@Override
public Object convert(Type targetType, Object value) {
if (targetType instanceof Class) {
// 自定义日期格式
if (null != this.format && targetType instanceof Class) {
final Class<?> clazz = (Class<?>) targetType;
// https://gitee.com/dromara/hutool/issues/I6IS5B
if (Date.class.isAssignableFrom(clazz)) {
@@ -41,8 +43,12 @@ public class NumberWithFormat extends Number implements TypeConverter{
} else if(String.class == clazz){
return toString();
}
// 其他情况按照正常数字转换
}
throw new ConvertException("Unsupported target type {}", targetType);
// 按照正常数字转换
return Convert.convertWithCheck(targetType, this.number, null, false);
}
@Override

View File

@@ -41,6 +41,9 @@ public class NumberConverter extends AbstractConverter<Number> {
private final Class<? extends Number> targetType;
/**
* 构造
*/
public NumberConverter() {
this.targetType = Number.class;
}
@@ -67,7 +70,7 @@ public class NumberConverter extends AbstractConverter<Number> {
@Override
protected String convertToStr(Object value) {
String result = StrUtil.trim(super.convertToStr(value));
final String result = StrUtil.trim(super.convertToStr(value));
if (null != result && result.length() > 1) {
final char c = Character.toUpperCase(result.charAt(result.length() - 1));
if (c == 'D' || c == 'L' || c == 'F') {

View File

@@ -1,11 +1,11 @@
package cn.hutool.core.getter;
import cn.hutool.core.convert.Convert;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Date;
import cn.hutool.core.convert.Convert;
/**
* 基本类型的getter接口抽象实现所有类型的值获取都是通过将String转换而来<br>
* 用户只需实现getStr方法即可其他类型将会从String结果中转换 在不提供默认值的情况下, 如果值不存在或获取错误返回null<br>

View File

@@ -17,13 +17,7 @@ import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.*;
import java.util.concurrent.atomic.AtomicIntegerArray;
import java.util.concurrent.atomic.AtomicLongArray;
import java.util.concurrent.atomic.DoubleAdder;
@@ -143,6 +137,13 @@ public class ConvertTest {
Assert.assertEquals(8, dLong2);
}
@Test
public void toLongFromNumberWithFormatTest() {
final NumberWithFormat value = new NumberWithFormat(1678285713935L, null);
final Long aLong = Convert.convertWithCheck(Long.class, value, null, false);
Assert.assertEquals(new Long(1678285713935L), aLong);
}
@Test
public void toCharTest() {
final String str = "aadfdsfs";