Форматирование десятичной JsonResult ASP MVC 5 - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю с 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",
                    });

Спасибо!

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

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.ToString ();

2 - или на стороне клиента:

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

3 - Мой лучший выбор для манипулирования JSon в C #: https://www.newtonsoft.com/json

Вы можете сериализовать и десериализовать JSON и создавать собственные преобразования.

0 голосов
/ 28 ноября 2018

Для этого вы можете использовать Number helper.Вы можете перейти по этой ссылке, чтобы узнать больше: 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, '')
                        }
                    ]
                });
0 голосов
/ 28 ноября 2018

Вам необходимо установить собственную культуру:

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

System.Threading.Thread.CurrentThread.CurrentCulture = customCulture;

Спасибо.

...