我有一个内部使用的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"
}
}
答案 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.cs,JsonReader.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
等内容将字符串转换为数字值