mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
四则运算方式支持不生成负数结果
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user