德国文化 - 用逗号从JSON获取双倍数字

时间:2015-02-09 07:50:18

标签: c# json formatting cultureinfo culture

我有一个内部使用的MVC Web-API应用程序。我有一些表格和数字字段的页面。我需要在德国计算机上安装它,用户将只是德国人。在德国,他们写“3,5”而不是“3.5”(用逗号)。

在IIS配置中,文化是“不变文化”,因为计算机是德语 - 本地化是“de-DE”。

当用户在字段中写“3,5”时 - 我可以在firebug中看到“3,5”是用JSON发送的,但是服务器将其命名为“35”。

我可以在服务器端处理吗? (我不想改变json,因为我需要在每个字段和页面中都这样做)

 using Newtonsoft.Json;
 using Newtonsoft.Json.Converters;
 public class ItemsController : ApiController, IDisposable
 {
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public HttpResponseMessage UpdateItem(ItemViewModel itemVM)
        {
            // JSON data sent data.NumProp1 = "3,5"
            // itemVM.NumProp1 contains "35" instead of "3.5"
        }
}

4 个答案:

答案 0 :(得分:2)

您不应本地化您的JSON - 请参阅http://www.json.org了解规范(仅显示点作为分隔符)和How to localize when JSON-serializing?以查找类似问题。

我不建议您尝试阅读自定义的JSON - 现在听起来像是一个快速的胜利,但最终你根本就没有使用JSON。

答案 1 :(得分:0)

在处理持久性时,必须对所有字符串格式化调用使用CultureInfo.InvariantCulture(并且JSON交换在技术上是一种持久性形式):

  

保留数据

     

InvariantCulture属性可用于保存数据   与文化无关的格式。这提供了一种已知的格式   更改,可用于序列化和反序列化数据   文化。数据反序列化后,可以格式化   适当地基于当前用户的文化习俗。   例如,如果您选择将日期和时间数据保存在字符串中   表单,您可以将InvariantCulture对象传递给   DateTime.ToString(String, IFormatProvider)或   DateTimeOffset.ToString(IFormatProvider)方法创建字符串,   并且您可以将InvariantCulture对象传递给   DateTime.Parse(String, IFormatProvider)或   DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles)方法   将字符串转换回日期和时间值。这种技术   确保基础日期和时间值不会在何时更改   数据由来自不同文化的用户读取或写入。

这适用于所有类型:数字,小数,浮点数和双精度数,日期和时间等。在写入和读取序列化数据时使用不变文化。在JSON交换的两端使用不变文化。

顺便说一句,如果您使用内置的JSON序列化程序,您已经免费获得此午餐:JsonWriter.csJsonReader.cs

答案 2 :(得分:0)

正如已经说过的那样:JSON是一个标准,你永远不会偏离标准。这样做会让你的生活变得悲惨。

如果用户在Web表单中输入某些数字,则该Web表单应以正确的JSON格式序列化该表单。我认为通常情况已经完成,如果您在表单中使用正确的数字类型,例如input type='number'等。在服务器端,您应该使用InvariantCulture阅读它。

W3C承认这种对一般解决方案的需求,正如您在W3C HTML JSON form submission草案中所看到的那样。

答案 3 :(得分:0)

除了其他答案,如果你只想更换德语","使用当前文化1的小数分隔符,这使得转换正确解析,使用:

str = str.Replace(",", System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);

然后,您可以使用Convert.ToInt32

等内容将字符串转换为数字值