最新版本更新
https://code.jiangjiesheng.cn/article/363?from=csdn
c<30,30≤c<60,60≤c<100,100≤c 有值时,必须收尾相等。
BigDecimal endCheckValue = null;
for (BssCompareMethodParameterConfigAddVO configRow : actualSampleCompareList) {
endCheckValue = checkAddGetNextEndValueFromRow(endCheckValue, configRow);
}
//校验通过了后记录当前行,并取下一个开始的
private BigDecimal checkAddGetNextEndValueFromRow(BigDecimal lastValue, String measureValueRange, String rowKey) {
if (StringUtils.isBlank(measureValueRange)) {
return null;
}
//c<30,30≤c<60,60≤c<100,100≤c
List<BigDecimal> decimals = getNumeralFromStr(measureValueRange);
if (CollectionUtils.isEmpty(decimals)) {
throw new GnException(rowKey + "未填写正确的参比法测量值(c)区间:" + measureValueRange);
}
BigDecimal startCheckValue = decimals.get(0);
if (lastValue != null && !lastValue.equals(startCheckValue)) {
//注意,如果前端提交的两组的名称相同,那后端的逻辑分组就变成了1组
//如果需要校验名称重复,应该需要新增字段表示分组,启用 BssAnalysisMethodResultShowParameterConfigSaveVO::getAnalysisMethodUniqueTag
//不过没意义,分组字段和方法名称都需要前端控制不同,功能上实际是重复,且还需要保存。
throw new GnException(rowKey + "存在错误的参比法测量值(c)区间:" + measureValueRange);
}
//endCheckValue
return decimals.size() == 2 ? decimals.get(1) : startCheckValue;
}
public static void main(String[] args) {
// 示例输入字符串 Pattern.compile("[-+]?\\d*\\.?\\d+");
String expression = "c<30";
System.out.println(getNumeralFromStr(expression));
expression = "30≤c<60";
System.out.println(getNumeralFromStr(expression));
expression = "60≤c<100.3";
System.out.println(getNumeralFromStr(expression));
expression = "100≤c";
System.out.println(getNumeralFromStr(expression));
}
private static List<BigDecimal> getNumeralFromStr(String expression) {
// 正则表达式匹配数字
Pattern pattern = Pattern.compile("[-+]?\\d*\\.?\\d+");
Matcher matcher = pattern.matcher(expression);
List<BigDecimal> numbers = new ArrayList<>();
// 查找并收集所有找到的数字
while (matcher.find()) {
String numberStr = matcher.group();
BigDecimal number = new BigDecimal(numberStr);
numbers.add(number);
}
return numbers;
}