我有一个.NET应用程序,允许用户选择自己的语言和文化(日期/数字格式)。他们的文化设置存储在Thread.CurrentThread.CurrentCulture (也是Thread.CurrentThread.CurrentUICulture,但那是另一个问题)中。
当我通过Razor打印出一个var时,它以本地化格式显示:
<span>@bignum</span> (renders as "123.456" or "123,456")但是,我还需要将一些.NET变量传递给Javascript:
var js_bignum = @bignum;问题是,在这种情况下,Javascript不理解这些数字的本地化版本,因此它失败了,因为上面的语句变成:
var js_bignum = 123,456;这可能是因为用户浏览器的区域性设置与用户的webapp的区域性设置不同。无论如何,这是我们需要能够处理的情况。
那么处理这个问题最简单的方法是什么呢?我可以创建自己的Javascript ConvertToStandardNumberFormat(),它从.NET中获取一个字符串值并返回一个“标准”数字格式,但这看起来有点花哨。有没有办法强制.NET/razor呈现一个非本地化格式的数字?
var js_bignum = @price.ToUnlocalizedFormat(); (Is there something like this?)我只是想弄清楚这种情况下的最佳实践是什么。
谢谢!
发布于 2011-11-23 00:16:42
我会使用@price.ToString(CultureInfo.InvariantCulture)
编辑
我不同意João的回答,并认为这是一个糟糕的想法™。我不建议重新发明轮子。如果您喜欢更全面的方法,那么我会选择包含一个专用的C# JSON编码库(我推荐JsonFx.NET)。
最简单的方法是,我会做一个HtmlHelper扩展。类似于:
public static class JsonExtensions {
public static string ToJson(this HtmlHelper html) {
return new JsonWriter().Write(t);
}
}然后在视图中使用它:
@Html.ToJson(price)这应该可以处理原始类型和复杂类型。
在那之后,我可能会重构东西,并尝试提出一个更好的注入模式,这样我就不会在每次调用帮助器时创建一个新的JsonWriter。
但这将比以静态助手类的形式滚动自己的序列化程序要灵活得多(也经过测试)……
发布于 2011-11-23 00:26:51
正如在另一个答案中已经指出的,一个简单的解决方案是使用InvariantCulture调用ToString,但是这并不能清楚地传达您的意图,并且可能会导致人们认为InvariantCulture适用于其他数据类型。
如果我是你,我会将格式化逻辑封装在一个helper类中,如下所示,并在需要的地方调用helper方法:
public static class JsLiteral
{
public static string From(float number)
{
return From((double)number);
}
public static string From(double number)
{
return number.ToString(CultureInfo.InvariantCulture);
}
public static string From(bool flag)
{
return flag ? "true" : "false";
}
}当您在视图@JsLiteral.From(bignum)中使用它时,这更容易维护,而且也清楚地表达了您的意图。
https://stackoverflow.com/questions/8229848
复制相似问题