feat(core):优化数值转换逻辑以支持科学计数法

- 移除不必要的 Nullable 注解导入- 新增 isScientificNotation 方法用于检测科学计数法格式
- 修改 Double 类型数值转换逻辑,区分科学计数法与普通数值- 对于无法转换的科学计数法数值,记录警告日志并返回原始值
- 添加详细的 JavaDoc 注释说明科学计数法判断规则
This commit is contained in:
liushuang 2025-09-29 10:42:44 +08:00
parent c8e2e2dc5e
commit b4a6fdc278

@ -4,7 +4,6 @@ import cn.isliu.core.FileData;
import cn.isliu.core.annotation.TableProperty;
import cn.isliu.core.enums.BaseEnum;
import cn.isliu.core.enums.FileType;
import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
@ -24,6 +23,7 @@ import java.util.stream.Collectors;
public class GenerateUtil {
// 使用统一的FsLogger替代java.util.logging.Logger
/**
* 根据配置和数据生成DTO对象通用版本
*
@ -277,14 +277,18 @@ public class GenerateUtil {
result = bigDecimal.stripTrailingZeros().toPlainString();
} else if (value instanceof Double) {
String stringValue = convertValue(value);
try {
result = String.valueOf(Long.parseLong(stringValue));
} catch (NumberFormatException e) {
// 判断是否为科学计数法
if (isScientificNotation(stringValue)) {
try {
result = String.valueOf(((Double) Double.parseDouble(stringValue)).longValue());
} catch (NumberFormatException ex) {
throw new IllegalArgumentException("无法将值 '" + stringValue + "' 转换为 long 或科学计数法表示的数值", ex);
FsLogger.warn("无法将科学计数法值 '" + stringValue + "' 转换为 long, 直接返回原始值");
result = stringValue;
}
} else {
// 不是科学计数法直接返回原始字符串值
result = stringValue;
}
} else {
result = String.valueOf(value);
@ -303,6 +307,24 @@ public class GenerateUtil {
return result.trim();
}
/**
* 判断字符串是否为科学计数法格式
* 科学计数法格式数字 + E/e + 数字 1.23E+4, 1.23e-2
*
* @param value 要判断的字符串
* @return 如果是科学计数法返回true否则返回false
*/
private static boolean isScientificNotation(String value) {
if (value == null || value.trim().isEmpty()) {
return false;
}
String trimmed = value.trim();
// 使用正则表达式匹配科学计数法格式
// 匹配格式数字(可选小数点) + E/e + 可选正负号 + 数字
return trimmed.matches("^[+-]?\\d+(\\.\\d+)?[eE][+-]?\\d+$");
}
private static Object convertValue(Object value, Class<?> targetType) throws Exception {
if (value == null) return null;