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 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
|
||||||
|
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user