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

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.text.CharUtil;
import cn.hutool.v7.core.util.RandomUtil;
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
*/
public class MathGenerator implements CodeGenerator {
@Serial
private static final long serialVersionUID = -5514819971774091076L;
private static final String operators = "+-*";
/** 参与计算数字最大长度 */
/**
* 参与计算数字最大长度
*/
private final int numberLength;
/**
* 计算结果是否允许负数
*/
private final boolean resultHasNegativeNumber;
/**
* 构造
*/
public MathGenerator() {
this(2);
this(2, false);
}
/**
* 构造
*
* @param numberLength 参与计算最大数字位数
* @param resultHasNegativeNumber 结果是否允许负数
*/
public MathGenerator(final int numberLength) {
public MathGenerator(final int numberLength, final 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));
final char operator = RandomUtil.randomChar(operators);
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);
number2 = StrUtil.padAfter(number2, this.numberLength, CharUtil.SPACE);
return StrUtil.builder()//
.append(number1)//
.append(RandomUtil.randomChar(operators))//
.append(operator)//
.append(number2)//
.append('=').toString();
}

View File

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