!1363 四则运算方式支持不生成负数结果

Merge pull request !1363 from Theo/v5-dev
This commit is contained in:
Looly
2025-07-02 01:36:46 +00:00
committed by Gitee
2 changed files with 43 additions and 10 deletions

View File

@@ -19,35 +19,59 @@ public class MathGenerator implements CodeGenerator {
/** 参与计算数字最大长度 */
private final int numberLength;
/** 计算结果是否允许负数 */
private final boolean resultHasNegativeNumber;
/**
* 构造
*/
public MathGenerator() {
this(2);
this(2, true);
}
/**
* 构造
*
* @param numberLength 参与计算最大数字位
* @param resultHasNegativeNumber 结果是否允许负
*/
public MathGenerator(int numberLength) {
public MathGenerator(boolean resultHasNegativeNumber) {
this(2, resultHasNegativeNumber);
}
/**
* 构造
*
* @param numberLength 参与计算最大数字位数
* @param resultHasNegativeNumber 结果是否允许负数
*/
public MathGenerator(int numberLength, boolean resultHasNegativeNumber) {
this.numberLength = numberLength;
this.resultHasNegativeNumber = resultHasNegativeNumber;
}
@Override
public String generate() {
final int limit = getLimit();
String number1 = Integer.toString(RandomUtil.randomInt(limit));
String number2 = Integer.toString(RandomUtil.randomInt(limit));
char operator = RandomUtil.randomChar(operators);
int numberInt1 = 0;
int numberInt2 = 0;
numberInt1 = RandomUtil.randomInt(limit);
// 如果禁止了结果有负数,且计算方式正好计算为减法,需要第二个数小于第一个数
if (!resultHasNegativeNumber && CharUtil.equals('-',operator,false)) {
//如果第一个数为0第二个数必须为0随机[0,0)的数字会报错
numberInt2 = numberInt1 == 0 ? 0 : RandomUtil.randomInt(0, numberInt1);
} else {
numberInt2 = RandomUtil.randomInt(limit);
}
String number1 = Integer.toString(numberInt1);
String number2 = Integer.toString(numberInt2);
number1 = StrUtil.padAfter(number1, this.numberLength, CharUtil.SPACE);
number2 = StrUtil.padAfter(number2, this.numberLength, CharUtil.SPACE);
return StrUtil.builder()//
.append(number1)//
.append(RandomUtil.randomChar(operators))//
.append(number2)//
.append('=').toString();
.append(number1)//
.append(operator)//
.append(number2)//
.append('=').toString();
}
@Override

View File

@@ -1,6 +1,7 @@
package cn.hutool.captcha;
import cn.hutool.captcha.generator.MathGenerator;
import cn.hutool.core.math.Calculator;
import org.junit.jupiter.api.Test;
public class GeneratorTest {
@@ -11,5 +12,13 @@ public class GeneratorTest {
for (int i = 0; i < 1000; i++) {
mathGenerator.verify(mathGenerator.generate(), "0");
}
final MathGenerator mathGenerator1 = new MathGenerator(false);
for (int i = 0; i < 1000; i++) {
String generate = mathGenerator1.generate();
if( Calculator.conversion(generate) < 0){
throw new RuntimeException("No Pass");
}
}
}
}