带有Nullable <long>的EditorFor将修剪分数</long>

时间:2014-01-08 12:34:03

标签: c# asp.net asp.net-mvc

我的asp.net mvc web应用程序中有以下模型类: -

[Display(Name="RAM (in GB)")]
        public Nullable<long> TOTALMEMORY { get; set; }

表示以字节为单位的总计量。现在我需要通过在我的控制器类上执行以下操作将字节转换为GB: -

.MemoryInfo.TOTALMEMORY = (server.SystemInfo.MemoryInfo.TOTALMEMORY / (1024 * 1024 * 1024));

然后在视图上将使用以下两种语法显示: -

@Html.EditorFor(model =>model.SystemInfo.MemoryInfo.VIRTUALMEMORY) 

OR

@(Model.SystemInfo.MemoryInfo == null ? "" : Model.SystemInfo.MemoryInfo.TOTALMEMORY.ToString())

因此,如果数据库中的值为8583778304,则两种方式都会在剃刀视图中显示为7而不是7.99?任何人都可以尝试什么问题?

修改 目前

@Html.EditorFor(model =>model.SystemInfo.MemoryInfo.TotalMemoryGB)

将显示7.99426651000977而不是7.99

@(Model.SystemInfo.MemoryInfo == null ? "" : Model.SystemInfo.MemoryInfo.TotalMemoryGB.ToString())将显示6.51925802230835E-09。所以你能建议吗?

1 个答案:

答案 0 :(得分:1)

TOTALMEMORY是一个long值,表示它是一个64位整数。它根本不能容纳像7.99这样的十进制数。而且由于你使用整数除法,它总是只修剪结果,即忽略小数点后的所有内容。

如果小数对您很重要,请将其更改为可以为空的双重

public double? TOTALMEMORY { get; set; }

甚至更好,保持字段不变,保留EF映射,并添加连接到它的计算属性:

public long? TOTALMEMORY { get; set; }

[Display(Name="RAM (in GB)")]
public double? TotalMemoryGB 
{
   get 
   {
       // The 1024.0 serves to force double division, instead of integer
       return TOTALMEMORY / 1024.0 / 1024.0 / 1024.0;
   }
   set 
   {
       TOTALMEMORY = (long) (value * 1024 * 1024 * 1024);
   } 
}

现在,在您的UI中,您可以使用TotalMemoryGB,并以千兆字节为单位工作,同时保留数据库中的字节。