我正在编写一个例程,在将数据插入数据库之前验证数据,其中一个步骤是查看数值是否符合数字(x,y)SQL-Server类型的精度和比例。
我已经从SQL-Server获得了精度和规模,但是在C#中获得CLR值的精度和规模的最有效方法是什么,或者至少测试它是否适合给定的约束?
目前,我正在将CLR值转换为字符串,然后使用.IndexOf()查找小数点的位置。有更快的方法吗?
答案 0 :(得分:8)
System.Data.SqlTypes.SqlDecimal.ConvertToPrecScale( new SqlDecimal (1234.56789), 8, 2)
给出1234.67。它将截断小数位后的额外数字,并将抛出错误而不是尝试截断小数位前的数字(即ConvertToPrecScale(12344234,5,2)
答案 1 :(得分:4)
在不触发异常的情况下,您可以使用以下方法确定该值是否符合精度和比例约束。
private static bool IsValid(decimal value, byte precision, byte scale)
{
var sqlDecimal = new SqlDecimal(value);
var actualDigitsToLeftOfDecimal = sqlDecimal.Precision - sqlDecimal.Scale;
var allowedDigitsToLeftOfDecimal = precision - scale;
return
actualDigitsToLeftOfDecimal <= allowedDigitsToLeftOfDecimal &&
sqlDecimal.Scale <= scale;
}
答案 2 :(得分:2)
这是一种基于数学的方法。
private static bool IsValidSqlDecimal(decimal value, int precision, int scale)
{
var minOverflowValue = (decimal)Math.Pow(10, precision - scale) - (decimal)Math.Pow(10, -scale) / 2;
return Math.Abs(value) < minOverflowValue;
}
这考虑了sql server如何进行舍入并防止溢出错误,即使我们超出了精度。例如:
DECLARE @value decimal(10,2)
SET @value = 99999999.99499 -- Works
SET @value = 99999999.995 -- Error
答案 3 :(得分:0)
你可以使用decimal.Truncate(val)来获取值的整数部分和decimal.Remainder(val,1)来获取小数点后的部分,然后检查每个部分是否符合你的约束(我是猜测这可能是一个简单的&gt;或&lt; check)