You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用Fluent Validation验证Decimal类型的长度及数值大于零?

关于Fluent Validation处理Decimal类型的两个问题解答

嘿,我来帮你搞定这两个Fluent Validation的问题,直接上干货~

1. 如何检查Decimal类型的"长度"?

首先得明确:Decimal是数值类型,不存在像字符串那样的"长度"概念,你说的长度大概率是指整数部分的位数小数部分的位数,或者整个数值的总位数。这里分几种情况给你方案:

  • 如果要限制整数部分的最大位数(比如最多5位整数):
    可以用Must自定义验证逻辑,结合数学计算判断:

    RuleFor(p => p.YourDecimalProperty)
        .Must(d => 
        {
            // 先取整数部分
            var integerPart = Math.Truncate(d);
            // 计算整数部分的位数,注意处理0的情况
            return integerPart.ToString().Length <= 5;
        })
        .WithMessage("整数部分不能超过5位");
    
  • 如果要限制小数部分的位数(比如最多2位小数):
    可以用Fluent Validation内置的Precision规则,专门处理数值精度:

    RuleFor(p => p.YourDecimalProperty)
        .Precision(5, 2) // 第一个参数是总位数,第二个是小数位数
        .WithMessage("数值总位数不能超过5位,小数部分最多2位");
    
  • 如果要限制整个数值的总位数(包括整数+小数):
    可以把Decimal转成字符串后用正则验证,注意处理正负号和小数的情况:

    RuleFor(p => p.YourDecimalProperty)
        .Must(d => Regex.IsMatch(d.ToString(), @"^-?\d{1,3}(\.\d{1,2})?$"))
        .WithMessage("数值总位数不能超过5位(整数3位+小数2位)");
    

2. 验证Decimal类型变量大于零(日租金场景)

你现有的代码里犯了个小错误:MinimumLength(2)针对字符串类型的验证规则,用在Decimal类型的DailyPrice上完全不对哦!

要验证Decimal大于零,直接用Fluent Validation内置的GreaterThan规则就可以了,修改后的CarValidator代码如下:

public class CarValidator : AbstractValidator<Car> 
{ 
    public CarValidator() 
    { 
        RuleFor(p => p.Name).MinimumLength(2); 
        // 替换成GreaterThan(0),还可以自定义错误提示
        RuleFor(p => p.DailyPrice)
            .GreaterThan(0)
            .WithMessage("日租金必须大于零");
    } 
}

如果需要允许等于零但不能小于0,就把GreaterThan(0)换成GreaterThanOrEqualTo(0)即可。

内容的提问来源于stack exchange,提问作者ouzdev

火山引擎 最新活动