在 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 解析本地化数字的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Javascript 中从 Django 读取对象

如何在swift中从.js文件中调用javascript函数

如何在 AngularJs 中从 HTML 转换 JavaScript 代码

无法在 Phonegap 中从 javascript 调用本机函数

在 JavaScript 中从父级调用子方法

在javascript中从纪元日期转换[重复]