当小数点左边是0而不是1时,数值数据的ASP.NET MVC DisplayFormat是不同的

问题描述 投票:1回答:1

我正在使用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},但这不会删除尾随的零。

asp.net-mvc asp.net-core asp.net-core-mvc
1个回答
1
投票

回想高中。那可能是你最后一次听到“有效数字”这个词。这实际上是由于遵守有效数字而导致的舍入误差。在第一个示例中,前导1提供了有效数字,因此不需要保留其余部分。那时,你只包括一个7位数字的6位数字,.NET只是将最后一位数字四舍五入,因为它小于5就变为0。

在第二个例子中,在第7位之前没有有效数字,这意味着需要保留第7位,即使您只允许6位数。因此,.NET切换到指数表示法以保持该数字,同时符合总数字长度。

无论长短,除了扩展格式字符串中捕获的数字范围(即G7而不是G6)之外,你无能为力。但是,根据您使用的数字类型进行某些舍入将是不可避免的,除非您使用该类型的精确精度数:7表示Single,15表示Double或29表示Decimal

UPDATE

FWIW,如果您将数字格式化为字符串,则可以通过TrimEnd('0')删除任何尾随零。

© www.soinside.com 2019 - 2024. All rights reserved.