diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/generator/MathGenerator.java b/hutool-captcha/src/main/java/cn/hutool/captcha/generator/MathGenerator.java index 7395b3ee5..69347d9fd 100755 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/generator/MathGenerator.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/generator/MathGenerator.java @@ -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 diff --git a/hutool-captcha/src/test/java/cn/hutool/captcha/GeneratorTest.java b/hutool-captcha/src/test/java/cn/hutool/captcha/GeneratorTest.java index 0e0cfffd8..f30ae93c0 100755 --- a/hutool-captcha/src/test/java/cn/hutool/captcha/GeneratorTest.java +++ b/hutool-captcha/src/test/java/cn/hutool/captcha/GeneratorTest.java @@ -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"); + } + } } }