Browse Source

固定位数

master
han\hanst 4 weeks ago
parent
commit
45a171dbb7
  1. 1
      src/main/java/com/gaotao/modules/base/entity/ReportLabelList.java
  2. 2
      src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java
  3. 42
      src/main/java/com/gaotao/modules/base/service/Impl/LabelDataProcessorServiceImpl.java

1
src/main/java/com/gaotao/modules/base/entity/ReportLabelList.java

@ -33,6 +33,7 @@ public class ReportLabelList {
private Boolean showDecimalPlaces;
private Boolean thousandsSeparator;
private Boolean roundHalfUp;
private Integer fixedDigits;
@TableField(exist = false)
private Integer digits;
@TableField(exist = false)

2
src/main/java/com/gaotao/modules/base/service/Impl/BaseServiceImpl.java

@ -953,6 +953,8 @@ public class BaseServiceImpl implements BaseService {
newElement.setDecimalPlaces(originalElement.getDecimalPlaces());
newElement.setShowDecimalPlaces(originalElement.getShowDecimalPlaces());
newElement.setThousandsSeparator(originalElement.getThousandsSeparator());
newElement.setRoundHalfUp(originalElement.getRoundHalfUp());
newElement.setFixedDigits(originalElement.getFixedDigits());
newElement.setDigits(originalElement.getDigits());
newElement.setStep(originalElement.getStep());

42
src/main/java/com/gaotao/modules/base/service/Impl/LabelDataProcessorServiceImpl.java

@ -812,7 +812,8 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
private boolean hasNumberFormatSettings(ReportLabelList element) {
return element.getDecimalPlaces() != null ||
Boolean.TRUE.equals(element.getShowDecimalPlaces()) ||
Boolean.TRUE.equals(element.getThousandsSeparator());
Boolean.TRUE.equals(element.getThousandsSeparator()) ||
(element.getFixedDigits() != null && element.getFixedDigits() > 0);
}
/**
@ -823,7 +824,8 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
// 尝试解析为数字
BigDecimal number = new BigDecimal(text.trim());
return formatNumber(number, element.getDecimalPlaces(),
element.getShowDecimalPlaces(), element.getThousandsSeparator(), element.getRoundHalfUp());
element.getShowDecimalPlaces(), element.getThousandsSeparator(),
element.getRoundHalfUp(), element.getFixedDigits());
} catch (NumberFormatException e) {
log.debug("文本无法解析为数字,保持原样: {}", text);
return text;
@ -832,14 +834,14 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
@Override
public String formatNumber(Object value, Integer decimalPlaces, Boolean showDecimalPlaces, Boolean thousandsSeparator) {
return formatNumber(value, decimalPlaces, showDecimalPlaces, thousandsSeparator, true);
return formatNumber(value, decimalPlaces, showDecimalPlaces, thousandsSeparator, true, null);
}
/**
* 格式化数字数据支持四舍五入或截断
*/
private String formatNumber(Object value, Integer decimalPlaces, Boolean showDecimalPlaces,
Boolean thousandsSeparator, Boolean roundHalfUp) {
Boolean thousandsSeparator, Boolean roundHalfUp, Integer fixedDigits) {
if (value == null) {
return "";
}
@ -866,7 +868,11 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
}
// 创建格式化器
DecimalFormat formatter = createNumberFormatter(scale, Boolean.TRUE.equals(thousandsSeparator));
DecimalFormat formatter = createNumberFormatter(
scale,
Boolean.TRUE.equals(thousandsSeparator),
fixedDigits
);
// 设置舍入模式默认四舍五入取消勾选时按小数位截断
boolean useHalfUp = roundHalfUp == null || Boolean.TRUE.equals(roundHalfUp);
@ -883,14 +889,21 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
/**
* 创建数字格式化器
*/
private DecimalFormat createNumberFormatter(int decimalPlaces, boolean useThousandsSeparator) {
private DecimalFormat createNumberFormatter(int decimalPlaces, boolean useThousandsSeparator, Integer fixedDigits) {
StringBuilder pattern = new StringBuilder();
boolean useFixedDigits = fixedDigits != null && fixedDigits > 0;
if (useThousandsSeparator) {
pattern.append("#,##0");
pattern.append(useFixedDigits ? buildFixedIntegerPattern(fixedDigits) : "#,##0");
} else {
if (useFixedDigits) {
for (int i = 0; i < fixedDigits; i++) {
pattern.append("0");
}
} else {
pattern.append("0");
}
}
if (decimalPlaces > 0) {
pattern.append(".");
@ -902,6 +915,20 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
return new DecimalFormat(pattern.toString());
}
/**
* 构建带千分位的固定位数整数格式示例6 -> 000,000
*/
private String buildFixedIntegerPattern(int fixedDigits) {
StringBuilder pattern = new StringBuilder();
for (int i = fixedDigits; i > 0; i--) {
pattern.append("0");
if (i > 1 && (i - 1) % 3 == 0) {
pattern.append(",");
}
}
return pattern.toString();
}
@Override
public String replaceDataSourceFields(String text, Map<String, Object> dataMap) {
if (text == null || text.isEmpty()) {
@ -1612,6 +1639,7 @@ public class LabelDataProcessorServiceImpl implements LabelDataProcessorService
copy.setShowDecimalPlaces(original.getShowDecimalPlaces());
copy.setThousandsSeparator(original.getThousandsSeparator());
copy.setRoundHalfUp(original.getRoundHalfUp());
copy.setFixedDigits(original.getFixedDigits());
copy.setDigits(original.getDigits());
copy.setStep(original.getStep());

Loading…
Cancel
Save