【问题标题】:German culture - get double number from JSON with a comma德国文化 - 用逗号从 JSON 中获取双数
【发布时间】:2015-02-09 07:50:18
【问题描述】:

我有一个供内部使用的 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"
        }
}

【问题讨论】:

  • JSON 数字不得本地化。您应该在客户端解释用户输入并发送一个实际数字(使用.),或者将用户输入包含为字符串并在服务器端解释它。

标签: c# json formatting cultureinfo culture


【解决方案1】:

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

我不建议您尝试阅读您自定义的 JSON - 现在听起来可能很快就赢了,但最终您根本没有使用 JSON。

【讨论】:

  • 请注意,我写过我不想更改 JSON 中的数据。如果用户发送“3,5” - 这是发送到服务器的内容。我只希望服务器能够获得正确的值。我不认为我理解你的回答。在以 JSON 格式发送之前,是否需要将“3,5”更改为“3.5”?
  • @TamarG:是的,这是一般信息。不要发送不是 JSON 的东西。如果你是,那一定是。
  • 需要修复很多字段和页面 :-(
  • @TamarG:不幸的是,这不是我们可以解决的问题......我希望他们能像我回答中的链接一样迅速提出解决方案。
【解决方案2】:

在处理持久性时,您必须在所有字符串格式化调用中使用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

【讨论】:

    【解决方案3】:

    如前所述:JSON 是一种标准,您应该永远偏离标准。这样做会让你的生活变得悲惨。

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

    W3C 承认需要通用解决方案,您可以在草案W3C HTML JSON form submission 中看到。

    【讨论】:

      【解决方案4】:

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

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

      然后您可以使用 Convert.ToInt32 之类的东西将字符串转换为数值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多