You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用FluentValidator仅验证decimal类型数值的小数位(scale)?

FluentValidator仅校验decimal小数位(scale)的实现方案

有两种可行的实现方式,可根据业务场景选择:

方案1:使用内置ScalePrecision验证器取巧实现

ScalePrecision验证器的两个参数分别为「允许的小数位长度」和「允许的数字总精度(整数位+小数位)」,你可以将总精度设置为远大于业务场景可能出现的最大值,即可让总精度校验永远不触发,仅保留小数位校验逻辑。
示例代码:

// 2为小数位上限,28为decimal类型支持的最大总精度,可根据业务调整为更大值
RuleFor(x => x.要验证的decimal字段)
    .ScalePrecision(2, 28)
    .WithMessage("该字段仅允许保留2位小数");

方案2:自定义仅校验小数位的规则

如果需要完全排除总精度校验的逻辑,可以自己实现小数位计算逻辑,更贴合需求。推荐使用decimal.GetBits的方式计算小数位,避免不同区域文化的小数点符号差异导致的校验异常。
首先定义计算小数位的扩展方法:

public static class DecimalExtension
{
    /// <summary>
    /// 获取decimal数值的小数位长度
    /// </summary>
    public static int GetScale(this decimal value)
    {
        int[] bits = decimal.GetBits(value);
        // 小数位存储在第4个整数的16-23位
        return (bits[3] >> 16) & 0x7F;
    }
}

然后在验证器中使用:

RuleFor(x => x.要验证的decimal字段)
    .Must(val => 
    {
        // 可空decimal场景如果允许为空则直接返回true,不需要可空可移除空判断
        if (!val.HasValue) return true;
        return val.Value.GetScale() <= 2;
    })
    .WithMessage("该字段仅允许保留2位小数");

两种方案的适用场景:

  • 方案1代码量最少,不需要额外封装,适合快速开发场景
  • 方案2逻辑完全可控,没有额外的精度校验逻辑,适合对验证规则要求严格的场景

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 05:15:01