如何使用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
相关产品推荐
相关产品推荐

