在 javascript 中从 .NET/Razor 解析本地化数字的最佳方法是啥?
Posted
技术标签:
【中文标题】在 javascript 中从 .NET/Razor 解析本地化数字的最佳方法是啥?【英文标题】:What is the best way to parse localized numbers from .NET/Razor in javascript?在 javascript 中从 .NET/Razor 解析本地化数字的最佳方法是什么? 【发布时间】:2011-11-22 16:04:42 【问题描述】:我有一个 .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 中获取一个字符串值并返回一个“标准”数字格式,但这看起来有点像 hack。有没有办法强制 .NET/razor 呈现非本地化格式数字?
var js_bignum = @price.ToUnlocalizedFormat(); (Is there something like this?)
我只是想弄清楚这种情况下的最佳做法是什么。
谢谢!
【问题讨论】:
你能从 Razor 表达式中调用方法吗?因为这是number.ToString(CultureInfo.InvariantCulture)
应该做的(用于导入正确命名空间等的模 Razor 语法)。
【参考方案1】:
我会使用@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
。
但这将比以静态帮助程序类的形式滚动您自己的序列化程序更灵活(并且经过测试)......
【讨论】:
谢谢! “CultureInfo.InvariantCulture”是我所缺少的。这正是我想要的 - 一种与文化无关的 JavaScript 友好格式功能。【参考方案2】:正如在另一个答案中所述,一个简单的解决方案是使用InvariantCulture
调用ToString
,但这并不能清楚地传达您的意图,并且可能会导致人们认为InvariantCulture
适用于其他数据类型。
如果我是你,我会将格式化逻辑包装在一个辅助类中,如下所示,并在需要时调用辅助方法:
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)
中使用它时,它更易于维护并且也可以清楚地表达您的意图。
【讨论】:
以上是关于在 javascript 中从 .NET/Razor 解析本地化数字的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何在swift中从.js文件中调用javascript函数
如何在 AngularJs 中从 HTML 转换 JavaScript 代码