2009-04-17 31 views
5

我正在使用NerdDinner样本application,并到达处理虚拟地球地图的部分。该应用程序存储经度和纬度的一些值。不幸的是,在我的系统中,浮点数以逗号作为小数点分隔符存储,而不是像美国那样的点。所以如果我的纬度是47.64,它会被检索并显示为47,64。因为该值在函数调用中传递给虚拟地球API,所以它在此时失败(例如,JavaScript API预计会得到47.64,-122.13,但会获得47,64,-122,13)。如何全球化ASP.NET MVC视图(特别是小数分隔符)?

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

我不知道如何做到这一点与MVC。我需要一个定制的ViewPage什么的?有没有一个容易方式来解决这个问题?例子?

+0

看来,这已经记录为错误:http ://nerddinner.codeplex.com/WorkItem/View.aspx?WorkItemId = 2616 – 2009-04-17 16:17:32

+0

嗯。也许这是一个错误?我在我的web.config文件中添加了,以确保文化被设置为en-US应用程序范围,但是根本没有任何帮助,只有在我发布后才发布。 – 2009-04-23 13:12:59

回答

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 = "."; 
      } 
     } 
    } 
} 

Edit.aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="NerdDinner.Views.NerdDinnerViewPage<NerdDinner.Models.DinnerFormViewModel>" %> 
0

当你说

在我的系统浮点数存储用逗号作为小数点分隔

我假设你的意思是他们是格式化用逗号,浮点号码存储为float

虽然您可以通过设置文化来解决格式问题,但“真正的”修复方法是更改​​代码。好吧,这不是你的代码,所以也许你不想在这个场合做到这一点,但对于一般的参考你需要确保格式化浮动或其他任何你使用适当的文化。在为一个API使用的数字格式化的情况下,您可以使用InvariantCulture。

I.e.使用foo.ToString(CultureInfo.InvariantCulture)而不是foo.ToString(),同样使用string.Format(...)。

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

编辑2我建议你尝试以下操作: 在SearchController.cs变化JsonDinnerLatitudeLongitudestrings。即

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方法,改变纬度/龙线正确格式化字符串的JavaScript:

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

这应该意味着你不需要你把修复,并应该解决你的其他问题......我将在哪里发表评论。希望这可以帮助,我还没有完全测试,因为我不在你的语言环境,但它肯定似乎工作。

2

我是一个丹麦的开发商和面临完全一样的问题。我发现已经由克里斯托夫Neirynck在他的博客开发敬请描述的工作液:

Custom Model Binder

最好的问候,芬兰人Vilsbaek

0

我使用的TemplateEditor一个简单的quickfix。我的应用程序只使用瑞典语(逗号作为小数点分隔符),所以它是一个单一的字符串。更换,但你当然可以让它知道多种文化。

在我的意见/共享/ EditorTemplates/Decimal.ascx:(。)

0

我解决了这个在JavaScript的一侧,而不是,确保什么是传递到地图 - 库使用点,并且填充到文本框中的内容使用逗号(,)。显然,这不是为了本地化,而是快速修复。

Map.js在callbackForLocation:

//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('.', ',')); 
} 

Map.ascx在 jQuery的准备():

var latitude = <%=Model.Latitude.ToString().Replace(',', '.')%>; 
    var longitude = <%=Model.Longitude.ToString().Replace(',', '.')%>;