德国文化 - 从 JSON 中获取带逗号的双数

German culture - get double number from JSON with a comma

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

在 IIS 配置中,区域性是 "Invariant culture",并且由于计算机是德语 - 本地化是 "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"
        }
}

您不应该本地化您的 JSON - 请参阅 http://www.json.org for the spec (which only shows the dot as a separator) and How to localize when JSON-serializing? 了解类似的问题。

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

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

Persisting Data

The InvariantCulture property can be used to persist data in a culture-independent format. This provides a known format that does not change and that can be used to serialize and deserialize data across cultures. After the data is deserialized, it can be formatted appropriately based on the cultural conventions of the current user. For example, if you choose to persist date and time data in string form, you can pass the InvariantCulture object to the DateTime.ToString(String, IFormatProvider) or DateTimeOffset.ToString(IFormatProvider) method to create the string, and you can pass the InvariantCulture object to the DateTime.Parse(String, IFormatProvider) or DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) method to convert the string back to a date and time value. This technique ensures that the underlying date and time values do not change when the data is read or written by users from different cultures.

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

顺便说一句,如果您使用内置的 JSON 序列化器,您就已经可以免费享用这顿午餐了:JsonWriter.cs, JsonReader.cs.

前面说过:JSON是一个标准,你应该永远不要偏离这个标准。这样做会让你的生活变得悲惨。

如果用户在 Web 表单中输入一些数字,该 Web 表单应该以正确的 JSON 格式对其进行序列化。我认为通常这已经完成了,如果您在表单中使用正确的数字类型,例如 input type='number' 等。在服务器端,您应该使用 InvariantCulture.

读取它

W3C 承认需要通用解决方案,如您在草案中所见 W3C HTML JSON form submission

除了其他答案之外,如果您只想将德语的“,”小数点分隔符替换为当前文化分隔符,从而使转换解析正确,请使用:

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

然后您可以使用 Convert.ToInt32

之类的东西将您的字符串转换为数值