当试图获得它时,错误的双精度值

本文关键字:错误 双精度 | 更新日期: 2023-09-27 18:08:11

我正在开发一个ASP。NET MVC web应用程序。在我的一个视图中,我有一个列表框,其中填充了一些双值(基于我的ViewModel):

public class SuggestionViewModel
{
    public bool PADP { get; set; }
    public bool PremedicationPADP { get; set; }
    public double NbPADP { get; set; }
    public IEnumerable<SelectListItem> PADPItems { get; set; }
    public bool Other { get; set; }
    public SuggestionViewModel()
    {
        PADPItems = (new double[] { 0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4 }).Select(d => new SelectListItem { Value = d.ToString(), Text = d.ToString() });
        PADCItems = (new double[] { 0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4 }).Select(d => new SelectListItem { Value = d.ToString(), Text = d.ToString() });
    }
}

当我试图通过控制器中的动作恢复这些值时,我得到了一些错误的值。例如,如果我在视图中选择'0.25',我将得到'25.0',这是完全错误的。为什么当我试图得到它的时候,它的价值发生了变化?

编辑:列表框HTML代码我得到:

<option value ="0,25">0,25</option>
<option value ="0,5">0,50</option>
<option value ="0,75">0,75</option>
<option value ="1">1</option>

当试图获得它时,错误的双精度值

我认为"正确的做法"是将整个解决方案的本地化设置为法语(根据评论,这是您使用的)。然而,这通常会引入开销并影响其他设置,例如外部组件的配置设置(例如jQueryUI, Kendo——考虑日期)。另一种解决方案是将模型的类型从double更改为string,并在控制器中使用目标本地化对其进行解析。

public class SuggestionViewModel
{
    public bool PADP { get; set; }
    public bool PremedicationPADP { get; set; }
    public string NbPADP { get; set; } //*1
    public IEnumerable<SelectListItem> PADPItems { get; set; }
    public bool Other { get; set; }
    public SuggestionViewModel()
    {
         PADPItems = (new double[] { 0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4 }).Select(d => new SelectListItem { Value = d.ToString(), Text = d.ToString() });
         PADCItems = (new double[] { 0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.25, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4 }).Select(d => new SelectListItem { Value = d.ToString(), Text = d.ToString() });
    }
}

我假设你在NbPADP属性中得到你选择的值(如果我错了,请纠正我)。当您使用您的模型时,您可以通过使用法语本地化转换它来获得双精度值:

 double dNbPADP = Double.Parse(model.NbPADP, new CultureInfo("fr-FR"));