mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
@@ -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
|
||||
|
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user