fix isBwetween

This commit is contained in:
Looly 2025-11-20 10:48:49 +08:00
parent fceeafebce
commit 9e87ff60da
2 changed files with 117 additions and 96 deletions

View File

@ -28,6 +28,7 @@ import cn.hutool.v7.core.text.StrUtil;
import cn.hutool.v7.core.util.CharsetUtil; import cn.hutool.v7.core.util.CharsetUtil;
import cn.hutool.v7.core.util.ObjUtil; import cn.hutool.v7.core.util.ObjUtil;
import java.math.BigDecimal;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Date; import java.util.Date;
@ -1052,8 +1053,13 @@ public class Validator {
Assert.notNull(value); Assert.notNull(value);
Assert.notNull(min); Assert.notNull(min);
Assert.notNull(max); Assert.notNull(max);
final double doubleValue = value.doubleValue(); // final double doubleValue = value.doubleValue();
return (doubleValue >= min.doubleValue()) && (doubleValue <= max.doubleValue()); // return (doubleValue >= min.doubleValue()) && (doubleValue <= max.doubleValue());
// 通过 NumberUtil 转换为 BigDecimal使用 BigDecimal 进行比较以保留精度
BigDecimal valBd = NumberUtil.toBigDecimal(value);
BigDecimal minBd = NumberUtil.toBigDecimal(min);
BigDecimal maxBd = NumberUtil.toBigDecimal(max);
return valBd.compareTo(minBd) >= 0 && valBd.compareTo(maxBd) <= 0;
} }
/** /**

View File

@ -27,6 +27,9 @@ import org.junit.jupiter.api.Test;
import java.util.Date; import java.util.Date;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
/** /**
* 验证器单元测试 * 验证器单元测试
* *
@ -36,10 +39,10 @@ public class ValidatorTest {
@Test @Test
public void isNumberTest() { public void isNumberTest() {
Assertions.assertTrue(Validator.isNumber("45345365465")); assertTrue(Validator.isNumber("45345365465"));
Assertions.assertTrue(Validator.isNumber("0004545435")); assertTrue(Validator.isNumber("0004545435"));
Assertions.assertTrue(Validator.isNumber("5.222")); assertTrue(Validator.isNumber("5.222"));
Assertions.assertTrue(Validator.isNumber("0.33323")); assertTrue(Validator.isNumber("0.33323"));
} }
@Test @Test
@ -48,74 +51,74 @@ public class ValidatorTest {
final String var2 = "str"; final String var2 = "str";
final String var3 = "180"; final String var3 = "180";
final String var4 = "身高180体重180"; final String var4 = "身高180体重180";
Assertions.assertFalse(Validator.hasNumber(var1)); assertFalse(Validator.hasNumber(var1));
Assertions.assertFalse(Validator.hasNumber(var2)); assertFalse(Validator.hasNumber(var2));
Assertions.assertTrue(Validator.hasNumber(var3)); assertTrue(Validator.hasNumber(var3));
Assertions.assertTrue(Validator.hasNumber(var4)); assertTrue(Validator.hasNumber(var4));
} }
@Test @Test
public void isLetterTest() { public void isLetterTest() {
Assertions.assertTrue(Validator.isLetter("asfdsdsfds")); assertTrue(Validator.isLetter("asfdsdsfds"));
Assertions.assertTrue(Validator.isLetter("asfdsdfdsfVCDFDFGdsfds")); assertTrue(Validator.isLetter("asfdsdfdsfVCDFDFGdsfds"));
Assertions.assertTrue(Validator.isLetter("asfdsdf你好dsfVCDFDFGdsfds")); assertTrue(Validator.isLetter("asfdsdf你好dsfVCDFDFGdsfds"));
} }
@Test @Test
public void isUperCaseTest() { public void isUperCaseTest() {
Assertions.assertTrue(Validator.isUpperCase("VCDFDFG")); assertTrue(Validator.isUpperCase("VCDFDFG"));
Assertions.assertTrue(Validator.isUpperCase("ASSFD")); assertTrue(Validator.isUpperCase("ASSFD"));
Assertions.assertFalse(Validator.isUpperCase("asfdsdsfds")); assertFalse(Validator.isUpperCase("asfdsdsfds"));
Assertions.assertFalse(Validator.isUpperCase("ASSFD你好")); assertFalse(Validator.isUpperCase("ASSFD你好"));
} }
@Test @Test
public void isLowerCaseTest() { public void isLowerCaseTest() {
Assertions.assertTrue(Validator.isLowerCase("asfdsdsfds")); assertTrue(Validator.isLowerCase("asfdsdsfds"));
Assertions.assertFalse(Validator.isLowerCase("aaaa你好")); assertFalse(Validator.isLowerCase("aaaa你好"));
Assertions.assertFalse(Validator.isLowerCase("VCDFDFG")); assertFalse(Validator.isLowerCase("VCDFDFG"));
Assertions.assertFalse(Validator.isLowerCase("ASSFD")); assertFalse(Validator.isLowerCase("ASSFD"));
Assertions.assertFalse(Validator.isLowerCase("ASSFD你好")); assertFalse(Validator.isLowerCase("ASSFD你好"));
} }
@Test @Test
public void isBirthdayTest() { public void isBirthdayTest() {
final boolean b = Validator.isBirthday("20150101"); final boolean b = Validator.isBirthday("20150101");
Assertions.assertTrue(b); assertTrue(b);
final boolean b2 = Validator.isBirthday("2015-01-01"); final boolean b2 = Validator.isBirthday("2015-01-01");
Assertions.assertTrue(b2); assertTrue(b2);
final boolean b3 = Validator.isBirthday("2015.01.01"); final boolean b3 = Validator.isBirthday("2015.01.01");
Assertions.assertTrue(b3); assertTrue(b3);
final boolean b4 = Validator.isBirthday("2015年01月01日"); final boolean b4 = Validator.isBirthday("2015年01月01日");
Assertions.assertTrue(b4); assertTrue(b4);
final boolean b5 = Validator.isBirthday("2015.01.01"); final boolean b5 = Validator.isBirthday("2015.01.01");
Assertions.assertTrue(b5); assertTrue(b5);
final boolean b6 = Validator.isBirthday("2018-08-15"); final boolean b6 = Validator.isBirthday("2018-08-15");
Assertions.assertTrue(b6); assertTrue(b6);
//验证年非法 //验证年非法
Assertions.assertFalse(Validator.isBirthday("2095.05.01")); assertFalse(Validator.isBirthday("2095.05.01"));
//验证月非法 //验证月非法
Assertions.assertFalse(Validator.isBirthday("2015.13.01")); assertFalse(Validator.isBirthday("2015.13.01"));
//验证日非法 //验证日非法
Assertions.assertFalse(Validator.isBirthday("2015.02.29")); assertFalse(Validator.isBirthday("2015.02.29"));
} }
@Test @Test
public void isCitizenIdTest() { public void isCitizenIdTest() {
// 18为身份证号码验证 // 18为身份证号码验证
final boolean b = Validator.isCitizenId("110101199003074477"); final boolean b = Validator.isCitizenId("110101199003074477");
Assertions.assertTrue(b); assertTrue(b);
// 15位身份证号码验证 // 15位身份证号码验证
final boolean b1 = Validator.isCitizenId("410001910101123"); final boolean b1 = Validator.isCitizenId("410001910101123");
Assertions.assertTrue(b1); assertTrue(b1);
// 10位身份证号码验证 // 10位身份证号码验证
final boolean b2 = Validator.isCitizenId("U193683453"); final boolean b2 = Validator.isCitizenId("U193683453");
Assertions.assertTrue(b2); assertTrue(b2);
} }
@Test @Test
@ -126,145 +129,157 @@ public class ValidatorTest {
@Test @Test
public void isEmailTest() { public void isEmailTest() {
final boolean email = Validator.isEmail("abc_cde@163.com"); final boolean email = Validator.isEmail("abc_cde@163.com");
Assertions.assertTrue(email); assertTrue(email);
final boolean email1 = Validator.isEmail("abc_%cde@163.com"); final boolean email1 = Validator.isEmail("abc_%cde@163.com");
Assertions.assertTrue(email1); assertTrue(email1);
final boolean email2 = Validator.isEmail("abc_%cde@aaa.c"); final boolean email2 = Validator.isEmail("abc_%cde@aaa.c");
Assertions.assertTrue(email2); assertTrue(email2);
final boolean email3 = Validator.isEmail("xiaolei.lu@aaa.b"); final boolean email3 = Validator.isEmail("xiaolei.lu@aaa.b");
Assertions.assertTrue(email3); assertTrue(email3);
final boolean email4 = Validator.isEmail("xiaolei.Lu@aaa.b"); final boolean email4 = Validator.isEmail("xiaolei.Lu@aaa.b");
Assertions.assertTrue(email4); assertTrue(email4);
final boolean email5 = Validator.isEmail("luxiaolei_小磊@小磊.com"); final boolean email5 = Validator.isEmail("luxiaolei_小磊@小磊.com");
Assertions.assertTrue(email5); assertTrue(email5);
} }
@Test @Test
void issueI94YYUTest() { void issueI94YYUTest() {
final boolean ret = PatternPool.EMAIL.matcher(StrUtil.repeat("hutool\\\"", 1000)).matches(); final boolean ret = PatternPool.EMAIL.matcher(StrUtil.repeat("hutool\\\"", 1000)).matches();
Assertions.assertFalse(ret); assertFalse(ret);
} }
@Test @Test
public void isMobileTest() { public void isMobileTest() {
final boolean m1 = Validator.isMobile("13900221432"); final boolean m1 = Validator.isMobile("13900221432");
Assertions.assertTrue(m1); assertTrue(m1);
final boolean m2 = Validator.isMobile("015100221432"); final boolean m2 = Validator.isMobile("015100221432");
Assertions.assertTrue(m2); assertTrue(m2);
final boolean m3 = Validator.isMobile("+8618600221432"); final boolean m3 = Validator.isMobile("+8618600221432");
Assertions.assertTrue(m3); assertTrue(m3);
final boolean m4 = Validator.isMobile("19312341234"); final boolean m4 = Validator.isMobile("19312341234");
Assertions.assertTrue(m4); assertTrue(m4);
} }
@Test @Test
public void isMatchTest() { public void isMatchTest() {
String url = "http://aaa-bbb.somthing.com/a.php?a=b&c=2"; String url = "http://aaa-bbb.somthing.com/a.php?a=b&c=2";
Assertions.assertTrue(Validator.isMatchRegex(PatternPool.URL_HTTP, url)); assertTrue(Validator.isMatchRegex(PatternPool.URL_HTTP, url));
url = "https://aaa-bbb.somthing.com/a.php?a=b&c=2"; url = "https://aaa-bbb.somthing.com/a.php?a=b&c=2";
Assertions.assertTrue(Validator.isMatchRegex(PatternPool.URL_HTTP, url)); assertTrue(Validator.isMatchRegex(PatternPool.URL_HTTP, url));
url = "https://aaa-bbb.somthing.com:8080/a.php?a=b&c=2"; url = "https://aaa-bbb.somthing.com:8080/a.php?a=b&c=2";
Assertions.assertTrue(Validator.isMatchRegex(PatternPool.URL_HTTP, url)); assertTrue(Validator.isMatchRegex(PatternPool.URL_HTTP, url));
} }
@Test @Test
public void isGeneralTest() { public void isGeneralTest() {
String str = ""; String str = "";
boolean general = Validator.isGeneral(str, -1, 5); boolean general = Validator.isGeneral(str, -1, 5);
Assertions.assertTrue(general); assertTrue(general);
str = "123_abc_ccc"; str = "123_abc_ccc";
general = Validator.isGeneral(str, -1, 100); general = Validator.isGeneral(str, -1, 100);
Assertions.assertTrue(general); assertTrue(general);
// 不允许中文 // 不允许中文
str = "123_abc_ccc中文"; str = "123_abc_ccc中文";
general = Validator.isGeneral(str, -1, 100); general = Validator.isGeneral(str, -1, 100);
Assertions.assertFalse(general); assertFalse(general);
} }
@Test @Test
public void isPlateNumberTest(){ public void isPlateNumberTest(){
Assertions.assertTrue(Validator.isPlateNumber("粤BA03205")); assertTrue(Validator.isPlateNumber("粤BA03205"));
Assertions.assertTrue(Validator.isPlateNumber("闽20401领")); assertTrue(Validator.isPlateNumber("闽20401领"));
} }
@Test @Test
public void isChineseTest(){ public void isChineseTest(){
Assertions.assertTrue(Validator.isChinese("全都是中文")); assertTrue(Validator.isChinese("全都是中文"));
Assertions.assertTrue(Validator.isChinese("㐓㐘")); assertTrue(Validator.isChinese("㐓㐘"));
Assertions.assertFalse(Validator.isChinese("not全都是中文")); assertFalse(Validator.isChinese("not全都是中文"));
} }
@Test @Test
public void hasChineseTest() { public void hasChineseTest() {
Assertions.assertTrue(Validator.hasChinese("黄单桑米")); assertTrue(Validator.hasChinese("黄单桑米"));
Assertions.assertTrue(Validator.hasChinese("Kn 四兄弟")); assertTrue(Validator.hasChinese("Kn 四兄弟"));
Assertions.assertTrue(Validator.hasChinese("\uD840\uDDA3")); assertTrue(Validator.hasChinese("\uD840\uDDA3"));
Assertions.assertFalse(Validator.hasChinese("Abc")); assertFalse(Validator.hasChinese("Abc"));
} }
@Test @Test
public void isUUIDTest(){ public void isUUIDTest(){
Assertions.assertTrue(Validator.isUUID(IdUtil.randomUUID())); assertTrue(Validator.isUUID(IdUtil.randomUUID()));
Assertions.assertTrue(Validator.isUUID(IdUtil.fastSimpleUUID())); assertTrue(Validator.isUUID(IdUtil.fastSimpleUUID()));
Assertions.assertTrue(Validator.isUUID(IdUtil.randomUUID().toUpperCase())); assertTrue(Validator.isUUID(IdUtil.randomUUID().toUpperCase()));
Assertions.assertTrue(Validator.isUUID(IdUtil.fastSimpleUUID().toUpperCase())); assertTrue(Validator.isUUID(IdUtil.fastSimpleUUID().toUpperCase()));
} }
@Test @Test
public void isZipCodeTest(){ public void isZipCodeTest(){
// //
boolean zipCode = Validator.isZipCode("999077"); boolean zipCode = Validator.isZipCode("999077");
Assertions.assertTrue(zipCode); assertTrue(zipCode);
// //
zipCode = Validator.isZipCode("999078"); zipCode = Validator.isZipCode("999078");
Assertions.assertTrue(zipCode); assertTrue(zipCode);
// 2020年3月起改用6位邮编3+3 // 2020年3月起改用6位邮编3+3
zipCode = Validator.isZipCode("822001"); zipCode = Validator.isZipCode("822001");
Assertions.assertTrue(zipCode); assertTrue(zipCode);
// 内蒙 // 内蒙
zipCode = Validator.isZipCode("016063"); zipCode = Validator.isZipCode("016063");
Assertions.assertTrue(zipCode); assertTrue(zipCode);
// 山西 // 山西
zipCode = Validator.isZipCode("045246"); zipCode = Validator.isZipCode("045246");
Assertions.assertTrue(zipCode); assertTrue(zipCode);
// 河北 // 河北
zipCode = Validator.isZipCode("066502"); zipCode = Validator.isZipCode("066502");
Assertions.assertTrue(zipCode); assertTrue(zipCode);
// 北京 // 北京
zipCode = Validator.isZipCode("102629"); zipCode = Validator.isZipCode("102629");
Assertions.assertTrue(zipCode); assertTrue(zipCode);
} }
@Test @Test
public void isBetweenTest() { public void isBetweenTest() {
Assertions.assertTrue(Validator.isBetween(0, 0, 1)); assertTrue(Validator.isBetween(0, 0, 1));
Assertions.assertTrue(Validator.isBetween(1L, 0L, 1L)); assertTrue(Validator.isBetween(1L, 0L, 1L));
Assertions.assertTrue(Validator.isBetween(0.19f, 0.1f, 0.2f)); assertTrue(Validator.isBetween(0.19f, 0.1f, 0.2f));
Assertions.assertTrue(Validator.isBetween(0.19, 0.1, 0.2)); assertTrue(Validator.isBetween(0.19, 0.1, 0.2));
}
@Test
public void isBetweenPrecisionLossTest() {
// 使用超过 double 精度的值
long base = 10000000000000000L;
long min = base + 1;
long max = base + 2;
// double 转换下basemin max 是完全相等的因为 double 精度不够
// 预期结果为false但是因为double 精度不够导致输出为true
assertFalse(Validator.isBetween(base, min, max));
} }
@Test @Test
public void isCarVinTest(){ public void isCarVinTest(){
Assertions.assertTrue(Validator.isCarVin("LSJA24U62JG269225")); assertTrue(Validator.isCarVin("LSJA24U62JG269225"));
Assertions.assertTrue(Validator.isCarVin("LDC613P23A1305189")); assertTrue(Validator.isCarVin("LDC613P23A1305189"));
Assertions.assertFalse(Validator.isCarVin("LOC613P23A1305189")); assertFalse(Validator.isCarVin("LOC613P23A1305189"));
Assertions.assertTrue(Validator.isCarVin("LSJA24U62JG269225")); //标准分类1 assertTrue(Validator.isCarVin("LSJA24U62JG269225")); //标准分类1
Assertions.assertTrue(Validator.isCarVin("LDC613P23A1305189")); //标准分类1 assertTrue(Validator.isCarVin("LDC613P23A1305189")); //标准分类1
Assertions.assertTrue(Validator.isCarVin("LBV5S3102ESJ25655")); //标准分类1 assertTrue(Validator.isCarVin("LBV5S3102ESJ25655")); //标准分类1
Assertions.assertTrue(Validator.isCarVin("LBV5S3102ESJPE655")); //标准分类2 assertTrue(Validator.isCarVin("LBV5S3102ESJPE655")); //标准分类2
Assertions.assertFalse(Validator.isCarVin("LOC613P23A1305189")); //错误示例 assertFalse(Validator.isCarVin("LOC613P23A1305189")); //错误示例
} }
@Test @Test
public void isCarDrivingLicenceTest(){ public void isCarDrivingLicenceTest(){
Assertions.assertTrue(Validator.isCarDrivingLicence("430101758218")); assertTrue(Validator.isCarDrivingLicence("430101758218"));
} }
@Test @Test
@ -281,8 +296,8 @@ public class ValidatorTest {
final String content = "https://detail.tmall.com/item.htm?" + final String content = "https://detail.tmall.com/item.htm?" +
"id=639428931841&ali_refid=a3_430582_1006:1152464078:N:Sk5vwkMVsn5O6DcnvicELrFucL21A32m:0af8611e23c1d07697e"; "id=639428931841&ali_refid=a3_430582_1006:1152464078:N:Sk5vwkMVsn5O6DcnvicELrFucL21A32m:0af8611e23c1d07697e";
Assertions.assertTrue(Validator.isMatchRegex(PatternPool.URL, content)); assertTrue(Validator.isMatchRegex(PatternPool.URL, content));
Assertions.assertTrue(Validator.isMatchRegex(PatternPool.URL_HTTP, content)); assertTrue(Validator.isMatchRegex(PatternPool.URL_HTTP, content));
} }
@Test @Test
@ -292,7 +307,7 @@ public class ValidatorTest {
final Date end = DateUtil.parse("2022-09-09 21:22:00"); final Date end = DateUtil.parse("2022-09-09 21:22:00");
Validator.validateBetween(value, start, end, "您选择的日期超出规定范围!"); Validator.validateBetween(value, start, end, "您选择的日期超出规定范围!");
Assertions.assertTrue(true); assertTrue(true);
final Date value2 = DateUtil.parse("2023-08-09 21:22:00"); final Date value2 = DateUtil.parse("2023-08-09 21:22:00");
Assertions.assertThrows(ValidateException.class, ()-> Assertions.assertThrows(ValidateException.class, ()->
@ -325,18 +340,18 @@ public class ValidatorTest {
@Test @Test
public void isChineseNameTest(){ public void isChineseNameTest(){
Assertions.assertTrue(Validator.isChineseName("阿卜杜尼亚孜·毛力尼亚孜")); assertTrue(Validator.isChineseName("阿卜杜尼亚孜·毛力尼亚孜"));
Assertions.assertFalse(Validator.isChineseName("阿卜杜尼亚孜./毛力尼亚孜")); assertFalse(Validator.isChineseName("阿卜杜尼亚孜./毛力尼亚孜"));
Assertions.assertTrue(Validator.isChineseName("段正淳")); assertTrue(Validator.isChineseName("段正淳"));
Assertions.assertTrue(Validator.isChineseName("刘欣䶮")); assertTrue(Validator.isChineseName("刘欣䶮"));
Assertions.assertFalse(Validator.isChineseName("孟 伟")); assertFalse(Validator.isChineseName("孟 伟"));
Assertions.assertFalse(Validator.isChineseName("")); assertFalse(Validator.isChineseName(""));
Assertions.assertFalse(Validator.isChineseName("连逍遥0")); assertFalse(Validator.isChineseName("连逍遥0"));
Assertions.assertFalse(Validator.isChineseName("SHE")); assertFalse(Validator.isChineseName("SHE"));
// issue#IAOGDR // issue#IAOGDR
Assertions.assertFalse(Validator.isChineseName("张三。")); assertFalse(Validator.isChineseName("张三。"));
} }
@Test @Test