C#验证属性和小数
我正在编写一个验证属性:C#验证属性和小数,c#,validation,C#,Validation,我正在编写一个验证属性: public class MyAttribute : ValidationAttribute { public override bool IsValid(object aValue) { } } 但我丢失了最低有效位,因为十进制是作为对象传递的。例如: (object)0.00 0 //I need 0.00 (object)1.00 1 (object)1.23 1.23 (object)1.230 1.23 //I need
public class MyAttribute : ValidationAttribute
{
public override bool IsValid(object aValue)
{
}
}
但我丢失了最低有效位,因为十进制是作为对象传递的。例如:
(object)0.00
0 //I need 0.00
(object)1.00
1
(object)1.23
1.23
(object)1.230
1.23 //I need 1.230
由于我正在根据提供的精确十进制值进行验证,即1.230与1.23不同,尽管在数学上相同,但出于我的目的,它们是不同的
在编写验证属性时,是否有任何方法可以获取原始的十进制值?您无法基于传递的
十进制值进行此类验证。十进制1.23
与1.230
(故事结束)相同,无法确定差异
您需要更改验证以接受字符串
如果您将十进制作为对象传入,则它将保持为十进制。请注意,对于演示2,我如何将其转换为字符串,并测试小数点后的长度
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestApp1
{
class Program
{
static void Main(string[] args)
{
decimal demo1 = 1.2311M;
decimal demo2 = 1.2300M;
decimal demo3 = 1.00M;
decimal demo4 = 1M;
if (IsValid(demo1))
{
Console.WriteLine(ValueKeptZero(demo1));
}
if (IsValid(demo2))
{
Console.WriteLine(ValueKeptZero(demo2));
}
if (IsValid(demo3))
{
Console.WriteLine(ValueKeptZero(demo3));
}
if (IsValid(demo4))
{
Console.WriteLine(ValueKeptZero(demo4));
}
Console.ReadLine();
}
static bool IsValid(object value)
{
if (!(value.GetType() == typeof(decimal)))
return false;
decimal tmp = (decimal)value;
if(tmp == 1.23M)
{
string test = tmp.ToString();
if(test.Substring(test.IndexOf(".") + 1).Length != 4)
{
return false;
}
}
return true;
}
static decimal ValueKeptZero(object value)
{
return (decimal)value;
}
}
}
有什么理由不能使用泛型吗?对象总是一个数字吗?泛型在这里有什么帮助?IsValid()是否始终提供对象?我会很高兴有一个解决方案,该属性只能应用于十进制属性,因此始终具有say IsValid(decomal aValue),但我不认为这是怎么可能的?十进制是对象。。。我想我想说的是,如果你能解释一下为什么1.23!=1.230
在您的情况下,我们可以更好地帮助您,因为就小数而言,1.23==1.230
@muckeypock是的,我可以使用的是有效的(十进制值)但是我正在尝试使用ValidationAttribute,以便它可以根据需要用作属性上的注释。您能给我演示一个使用传递字符串的ValidationAttribute的示例吗?这也是同样的问题,我猜最低有效数字在转换为字符串的过程中会丢失?@我所有的单元测试都在默默地截断零,但当我调整它以使用x.xxM符号时,一切都很好。当我期望它们时,我现在有了零。