【问题标题】:Formating decimal JsonResult ASP MVC 5格式化十进制 JsonResult ASP MVC 5
【发布时间】:2019-04-30 10:00:27
【问题描述】:

我正在使用 ASP MVC 5 和 DataTables 插件,但在格式化小数时遇到了一些问题。

我需要用点作为千位分隔符和逗号作为小数分隔符来格式化数字。

我正在尝试使用DisplayFormat 来做这件事,但由于我将数据作为 Json 返回,所以它只是不适用

这是我的问题的一个小例子

public class MyClass
{
   [DisplayFormat(DataFormatString = "{0:0.##}")]
   decimal MyDecimal {get;set;}
}

在控制器中

public JsonResult LoadDataTables()
{    
    using(var db = new ExampleContext())
    {
        var data = db.MyRepository.Select(x => new MyClass
        {
            MyDecimal = x.mydecimal
        }).ToList();
        //i'm ignoring a lot of processing to create a short snippet
        return Json(new { draw = draw, recordsFiltered = recordsTotal, recordsTotal = recordsTotal, data = data });
    }
}

然后,在前端,json以逗号表示千位,点表示小数分隔

我该如何处理?有什么方法可以申请CultureInfo或者手动设置转换?

编辑:在我看来,这就是我加载数据的方式

var table = $('#myTabla').DataTable({
                    processing: true,
                    serverSide: true,
                    filter: true,
                    orderMulti: false,
                    paging: true,
                    pageLength: 10,
                    ajax: {
                        "url": '@Url.Action("LoadDataTables")',
                        "type": "POST",
                        "datatype": "json",
                    });

谢谢!

【问题讨论】:

  • 朋友,您能在 View 中显示您的代码吗?
  • 这里是 ToString() 输出格式的文档:docs.microsoft.com/en-us/dotnet/standard/base-types/…。您可以应用 CultureInfo 进行输出。
  • @Tomato32 添加了我如何加载数据,我的视图只有一个表,基本上是那个脚本
  • @Shim-Sao 问题是我必须在哪里应用它? DisplayFormat 注释永远不会发生
  • @JuanSalvadorPortugal 你的 JSON 很好。使用点 JSON 中数字的事实标准。是你 DataTable 配置应该指定小数字段如何显示

标签: c# json asp.net-mvc asp.net-mvc-5 datatables


【解决方案1】:

您可以为此使用数字助手。您可以访问此链接以参考更多:https://datatables.net/manual/data/renderers#Number-helper

这是一个示例。希望能帮到你,我的朋友:))

//控制器中的代码

public class Test
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public decimal Currency  { get; set; }
    }

private List<Test> Data()
        {
            var data = new List<Test>
            {
                new Test{ Id = 1, Name = "A1", Currency = 1000000.00M},
                new Test{ Id = 2, Name = "A2", Currency= 50000000.12M},
                new Test{ Id = 3, Name = "A3", Currency = 3000000.45M},
                new Test{ Id = 4, Name = "A4", Currency = 20000}
            };
            return data;
        }

        [HttpPost]
        public JsonResult LoadDataTables()
        {
            var data = Data();
            var recordsTotal = Data().Count;
            var recordsFiltered = Data().Count();
            string draw = Request.Form.GetValues("draw")[0];
            return Json(new { draw = Convert.ToInt32(draw), recordsTotal = recordsTotal, recordsFiltered = recordsFiltered, data = data }, JsonRequestBehavior.AllowGet);
        }

//查看

<table id="myTable" >
    <thead>
        <tr>
            <td >Id</td>
            <td >Name</td>
            <td>Currency</td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>

    var table = $('#myTable').DataTable({
                    processing: true,
                    serverSide: true,
                    filter: true,
                    orderMulti: false,
                    paging: true,
                    pageLength: 10,
                    ajax: {
                            "url": '@Url.Action("LoadDataTables", "Home")',
                            "type": "POST",
                            "datatype": "json",
                    },
                    "columns": [
                        {
                            "data": "Id"
                        }, {
                            "data": "Name"
                        }, {
                            "data": "Currency",
                            render: $.fn.dataTable.render.number('.', ',', 2, '')
                        }
                    ]
                });

【讨论】:

    【解决方案2】:

    您需要设置自定义文化:

    System.Globalization.CultureInfo customCulture = (System.Globalization.CultureInfo)
    System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
    customCulture.NumberFormat.NumberDecimalSeparator = ",";
    
    System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;
    

    谢谢。

    【讨论】:

    • 您好,感谢您的回答!我试了一下,结果是一样的:(
    • 您是否删除了属性 [DisplayFormat(DataFormatString = "{0:0.##}")]?
    • 是的,我已经配置了文化,我的问题是,由于某种原因它没有应用于 Json 转换
    【解决方案3】:

    1 - 你可以像这样用另一种方式做到这一点:

    public class MyClass
    {
       MyNumber MyDecimal {get;set;}
    }
    
    struct MyNumber
    {
        decimal Value {get;set;}
    
        ToString()
        {
            // Adapt number Format and CultureInfo as wanted
            return value.ToString("0:0.##", MyCultureInfo);
        }
    }
    

    用途:

    十进制 d = MyNumber.Value

    string s = (string)MyNumber;或 MyNumber.ToString();

    2 - 或者在客户端:

    // Invert . and ,
    // 1.22222.5689,56
    // to 1,22222,5689.56
    String.prototype.formatNumber = function(number)
    {
        return number.replace(',', ';').replace('.', ',').replace(';', '.');
    }
    

    3 - 我在 C# 中操作 JSON 的最佳选择是:https://www.newtonsoft.com/json

    您可以序列化和反序列化 json 并创建自定义转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-28
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      • 2020-07-21
      相关资源
      最近更新 更多