!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 int numberLength;
/** 计算结果是否允许负数 */
private final boolean resultHasNegativeNumber;
/** /**
* 构造 * 构造
*/ */
public MathGenerator() { 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.numberLength = numberLength;
this.resultHasNegativeNumber = resultHasNegativeNumber;
} }
@Override @Override
public String generate() { public String generate() {
final int limit = getLimit(); final int limit = getLimit();
String number1 = Integer.toString(RandomUtil.randomInt(limit)); char operator = RandomUtil.randomChar(operators);
String number2 = Integer.toString(RandomUtil.randomInt(limit)); 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); number1 = StrUtil.padAfter(number1, this.numberLength, CharUtil.SPACE);
number2 = StrUtil.padAfter(number2, this.numberLength, CharUtil.SPACE); number2 = StrUtil.padAfter(number2, this.numberLength, CharUtil.SPACE);
return StrUtil.builder()// return StrUtil.builder()//
.append(number1)// .append(number1)//
.append(RandomUtil.randomChar(operators))// .append(operator)//
.append(number2)// .append(number2)//
.append('=').toString(); .append('=').toString();
} }
@Override @Override

View File

@@ -1,6 +1,7 @@
package cn.hutool.captcha; package cn.hutool.captcha;
import cn.hutool.captcha.generator.MathGenerator; import cn.hutool.captcha.generator.MathGenerator;
import cn.hutool.core.math.Calculator;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
public class GeneratorTest { public class GeneratorTest {
@@ -11,5 +12,13 @@ public class GeneratorTest {
for (int i = 0; i < 1000; i++) { for (int i = 0; i < 1000; i++) {
mathGenerator.verify(mathGenerator.generate(), "0"); 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");
}
}
} }
} }