我正在使用ASP.NET MVC Core
在我的数据模型中有数字字段,精度为6
[Column(TypeName = "decimal(18,6)")]
public decimal? MyNumeric { get; set; }
我的视图模型它有一个带有DataFormatString属性的显示格式属性,强制它达到6精度。我使用DataFormatString MSDN article来查找适当的格式。
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:G6}")]
public decimal? MyNumeric{ get; set; }
如果我输入值为
1,00001
验证将其返回为
1,00001
对于
1,000001
验证返回它
1.
但是,当我使用前导零时会出现问题。使用相同的上述2个示例,但使用前导0而不是1
如果我输入值为
0,00001
验证保存将其返回
1E-05
而不是我期望的00001
0,000001
验证返回它
1E-06。
而不是我预期的0
因此,如果它是前导0或1,则行为会有所不同。
如何使验证器不处理0这样的整数值,但行为相同,如输出中没有“E”的整数值为1
我希望验证返回一个数字值,删除尾随零。但是因为上面的问题,如果第一个值是0,我被迫使用另一种格式{0:F},但这不会删除尾随的零。
回想高中。那可能是你最后一次听到“有效数字”这个词。这实际上是由于遵守有效数字而导致的舍入误差。在第一个示例中,前导1
提供了有效数字,因此不需要保留其余部分。那时,你只包括一个7位数字的6位数字,.NET只是将最后一位数字四舍五入,因为它小于5就变为0。
在第二个例子中,在第7位之前没有有效数字,这意味着需要保留第7位,即使您只允许6位数。因此,.NET切换到指数表示法以保持该数字,同时符合总数字长度。
无论长短,除了扩展格式字符串中捕获的数字范围(即G7
而不是G6
)之外,你无能为力。但是,根据您使用的数字类型进行某些舍入将是不可避免的,除非您使用该类型的精确精度数:7表示Single
,15表示Double
或29表示Decimal
。
UPDATE
FWIW,如果您将数字格式化为字符串,则可以通过TrimEnd('0')
删除任何尾随零。