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

This commit is contained in:
Looly
2025-07-02 09:36:15 +08:00
parent 91b8a50b68
commit 90e8d3bdac
2 changed files with 42 additions and 11 deletions

View File

@@ -18,8 +18,10 @@ package cn.hutool.v7.swing.captcha.generator;
import cn.hutool.v7.core.math.Calculator; import cn.hutool.v7.core.math.Calculator;
import cn.hutool.v7.core.text.CharUtil; import cn.hutool.v7.core.text.CharUtil;
import cn.hutool.v7.core.util.RandomUtil;
import cn.hutool.v7.core.text.StrUtil; import cn.hutool.v7.core.text.StrUtil;
import cn.hutool.v7.core.util.RandomUtil;
import java.io.Serial;
/** /**
* 数字计算验证码生成器 * 数字计算验证码生成器
@@ -28,40 +30,61 @@ import cn.hutool.v7.core.text.StrUtil;
* @since 4.1.2 * @since 4.1.2
*/ */
public class MathGenerator implements CodeGenerator { public class MathGenerator implements CodeGenerator {
@Serial
private static final long serialVersionUID = -5514819971774091076L; private static final long serialVersionUID = -5514819971774091076L;
private static final String operators = "+-*"; private static final String operators = "+-*";
/** 参与计算数字最大长度 */ /**
* 参与计算数字最大长度
*/
private final int numberLength; private final int numberLength;
/**
* 计算结果是否允许负数
*/
private final boolean resultHasNegativeNumber;
/** /**
* 构造 * 构造
*/ */
public MathGenerator() { public MathGenerator() {
this(2); this(2, false);
} }
/** /**
* 构造 * 构造
* *
* @param numberLength 参与计算最大数字位数 * @param numberLength 参与计算最大数字位数
* @param resultHasNegativeNumber 结果是否允许负数
*/ */
public MathGenerator(final int numberLength) { public MathGenerator(final int numberLength, final 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)); final char operator = RandomUtil.randomChar(operators);
String number2 = Integer.toString(RandomUtil.randomInt(limit)); final int numberInt1;
final int numberInt2;
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();
} }

View File

@@ -16,7 +16,9 @@
package cn.hutool.v7.swing.captcha; package cn.hutool.v7.swing.captcha;
import cn.hutool.v7.core.math.Calculator;
import cn.hutool.v7.swing.captcha.generator.MathGenerator; import cn.hutool.v7.swing.captcha.generator.MathGenerator;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
public class GeneratorTest { public class GeneratorTest {
@@ -27,5 +29,11 @@ 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(2, false);
for (int i = 0; i < 1000; i++) {
final String generate = mathGenerator1.generate();
Assertions.assertTrue(Calculator.conversion(generate) >= 0);
}
} }
} }