feat: 放宽扩展供应器内的样板手动倍增限制(不超int), 调整样板显示,以支持大数显示

This commit is contained in:
C-H716 2025-09-15 09:50:51 +08:00
parent 857fadc7ad
commit 6f42b50ea0
2 changed files with 49 additions and 21 deletions

View File

@ -134,10 +134,12 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
} else {
for (var stack : stacks) {
if (stack != null) {
long upper = 999999L * stack.what().getAmountPerUnit();
if (stack.amount() * scale > upper) {
long amt = stack.amount();
// 先检查乘法是否会导致超出 Long.MAX_VALUE避免溢出
if (amt > Integer.MAX_VALUE / scale) {
return false;
}
// 已移除原有的业务上限检查999999 * amountPerUnit仅保留溢出检查
}
}
return true;
@ -150,7 +152,18 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
var stack = src[i];
if (stack != null) {
long amt = stack.amount();
long newAmt = div ? (amt / scale) : (amt * scale);
long newAmt;
if (div) {
newAmt = amt / scale;
} else {
// 防御性检查虽然上游已检查过但在此处再次确保不会溢出
if (amt > Integer.MAX_VALUE / scale) {
// 遇到潜在溢出时跳过该项保持原样为 null调用方已通过 eap$checkModify 避免进入此分支
dst[i] = null;
continue;
}
newAmt = amt * scale;
}
dst[i] = new GenericStack(stack.what(), newAmt);
} else {
dst[i] = null;

View File

@ -1,5 +1,7 @@
package com.extendedae_plus.util;
import java.text.DecimalFormat;
/**
* 数字格式化工具类提供大数字和小数的格式化功能
*/
@ -7,46 +9,59 @@ public class NumberFormatUtil {
private NumberFormatUtil() {throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");}
/**
* 格式化数字将大数字转换为km等格式
* 支持小数显示小数点后为0则不显示0
* 格式化数字将大数字转换为 kMG 等格式物品用整数/一位小数显示规则
* @param number 要格式化的数字
* @return 格式化后的字符串
*/
public static String formatNumber(long number) {
if (number < 1000) {
return String.valueOf(number);
} else if (number < 1000000) {
double value = number / 1000.0;
return formatDecimal(value, "k");
} else {
double value = number / 1000000.0;
return formatDecimal(value, "m");
}
String[] preFixes = new String[]{"k", "M", "G", "T", "P", "E", "Z", "Y"};
double value = number;
String level = "";
for (int offset = 0; value >= 1000.0 && offset < preFixes.length; ++offset) {
value /= 1000.0;
level = preFixes[offset];
}
return formatDecimal(value, level);
}
/**
* 格式化带小数的数字支持流体等需要显示小数的场景
* 格式化带小数的数字支持流体等需要显示小数的场景保留至多两位小数
* 流体显示规则不同于物品统一使用两位小数的 DecimalFormat
* @param value 小数值
* @return 格式化后的字符串
*/
public static String formatNumberWithDecimal(double value) {
if (value < 1000) {
DecimalFormat smallDf = new DecimalFormat("#.##");
// 小于1000时若是整数则显示整数否则显示最多两位小数
if (value == (long) value) {
return String.valueOf((long) value);
} else {
return String.format("%.1f", value).replaceAll("\\.0$", "");
return smallDf.format(value);
}
} else if (value < 1000000) {
return formatDecimal(value / 1000.0, "k");
} else {
return formatDecimal(value / 1000000.0, "m");
}
String[] preFixes = new String[]{"k", "M", "G", "T", "P", "E", "Z", "Y"};
String level = "";
for (int offset = 0; value >= 1000.0 && offset < preFixes.length; ++offset) {
value /= 1000.0;
level = preFixes[offset];
}
DecimalFormat df = new DecimalFormat("#.##");
return df.format(value) + level;
}
/**
* 格式化小数如果小数点后为0则不显示0
* 格式化小数物品显示规则如果小数点后接近 0 则显示为整数否则显示一位小数
* @param value 小数值
* @param suffix 后缀kmg等
* @param suffix 后缀kMG
* @return 格式化后的字符串
*/
private static String formatDecimal(double value, String suffix) {
@ -54,9 +69,9 @@ public class NumberFormatUtil {
if (Math.abs(value - Math.round(value)) < 0.001) {
return String.valueOf(Math.round(value)) + suffix;
} else {
// 修复重复后缀问题先格式化数字再添加后缀
// 使用一位小数显示去掉末尾 .0
String formatted = String.format("%.1f", value).replaceAll("\\.0$", "");
return formatted + suffix;
}
}
}
}