5

我正在使用NerdDinner示例应用程序并到达处理虚拟地球地图的部分。应用程序存储一些经度和纬度值。不幸的是,在我的系统上,浮点数是用逗号作为小数点分隔符存储的,而不是像美国那样的点。因此,如果我的纬度为 47.64,它将被检索并显示为 47,64。因为该值在函数调用中传递给 Virtual Earth API,所以它在该点失败(例如 JavaScript API 需要47.64, -122.13,但得到47,64, -122,13)。

我需要确保应用程序始终使用点。在 WebForms 应用程序中,我将拥有一个覆盖该System.Web.UI.Page.InitializeCulture()方法的通用类,并且我将从该类继承我的页面。

我不确定如何对 MVC 做同样的事情。我需要定制ViewPage还是什么?有没有简单的方法来解决这个问题?例子?

4

5 回答 5

2

因为设置<globalization/>为 en-US 根本没有帮助,所以我决定创建一个自定义类来初始化正确的文化设置,并确保所有需要这种行为的视图都继承自我的自定义类。

NerdDinnerViewPage.cs:

using System.Globalization;
using System.Threading;
using System.Web.Mvc;

namespace NerdDinner.Views
{
    public class NerdDinnerViewPage<T> : ViewPage<T> where T : class
    {
        protected override void InitializeCulture()
        {
            base.InitializeCulture();

            Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentCulture.Clone() as CultureInfo;

            if (Thread.CurrentThread.CurrentCulture != null)
            {
                Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator = ".";
                Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator = ".";
            }
        }
    }
}

编辑.aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="NerdDinner.Views.NerdDinnerViewPage<NerdDinner.Models.DinnerFormViewModel>" %>
于 2009-04-27T12:24:48.983 回答
2

我是一名丹麦开发人员,面临着完全相同的问题。我找到了 Kristof Neirynck 在他的开发博客上描述的一个可行的解决方案:

自定义模型绑定器

最好的问候, Finn Vilsbaek

于 2009-08-15T10:45:59.507 回答
0

当你说

在我的系统上,浮点数以逗号作为小数分隔符存储

我假设您的意思是它们用逗号格式化,浮点数存储为float.

虽然您可以通过设置文化来解决格式问题,但“真正的”解决方法是更改​​代码。好的,这不是您的代码,所以也许您不想在这种情况下这样做,但作为一般参考,您需要确保在格式化浮点数或其他任何内容时使用适当的文化。在格式化数字以供 API 使用的情况下,您将使用 InvariantCulture。

即在使用 string.Format(...) 时使用foo.ToString(CultureInfo.InvariantCulture)代替和同样。foo.ToString()

编辑我刚刚查看了 NerdDinner 代码并意识到这个错误出现在 Javascript 而不是 C# 中,所以我上面的代码没有帮助。我不知道是否可以在 Javascript 中格式化数字,但我认为真正的解决方案是修复模型代码以返回格式正确的字符串。

编辑 2我建议您尝试以下操作:在更改SearchController.csLatitude更改为. IELongitudeJsonDinnerstrings

public class JsonDinner {
    public int      DinnerID    { get; set; }
    public string   Title       { get; set; }
    public string   Latitude    { get; set; }
    public string   Longitude   { get; set; }
    public string   Description { get; set; }
    public int      RSVPCount   { get; set; }
}

然后向下滚动到 SearchByLocation 方法并更改 Lat/Long 行以正确格式化 JavaScript 的字符串:

Latitude = dinner.Latitude.ToString(CultureInfo.InvariantCulture),
Longitude = dinner.Longitude.ToString(CultureInfo.InvariantCulture),

这应该意味着您不需要您输入的修复程序,并且应该解决您的其他问题......我将在哪里发表评论。希望这会有所帮助,因为我不在您的语言环境中,所以我还没有完全测试过,但它似乎确实有效。

于 2009-04-17T16:04:09.317 回答
0

我在模板编辑器中使用了一个简单的快速修复。我的应用程序只使用瑞典语(逗号作为小数分隔符),所以它是一个字符串。替换但你当然可以让它了解多种文化。

在我的 Views/Shared/EditorTemplates/Decimal.ascx 中:

于 2010-05-24T10:25:14.793 回答
0

我在 JavaScript 端修复了这个问题,确保传入地图库的内容使用点 (.),而填充回文本框的内容使用逗号 (,)。显然,这不是为了本地化,而是快速修复。

callbackForLocation 中的Map.js

//If we've found exactly one place, that's our address.
if (points.length === 1) {
    $("#Latitude").val(points[0].Latitude.toString().replace('.', ','));
    $("#Longitude").val(points[0].Longitude.toString().replace('.', ','));
}

jquery-ready() 中的Map.ascx :

    var latitude = <%=Model.Latitude.ToString().Replace(',', '.')%>;
    var longitude = <%=Model.Longitude.ToString().Replace(',', '.')%>;
于 2010-11-23T12:50:49.257 回答