从.NET/Razor解析本地化数字到JavaScript的最佳方法是什么?

5

我有一个.NET应用程序,允许用户选择自己的语言和文化(日期/数字格式)。他们的文化设置存储在Thread.CurrentThread.CurrentCulture中(也有Thread.CurrentThread.CurrentUICulture,但这是一个单独的问题)。

当我通过Razor打印变量时,它以本地化格式显示:

<span>@bignum</span> (renders as "123.456" or "123,456")

但是,我也需要将一些.NET变量传递给Javascript:

var js_bignum = @bignum;

问题在于,此时的Javascript无法识别这些数字的本地化版本,因此会出现错误,因为上述语句变成了:
var js_bignum = 123,456;

可能是因为用户浏览器的区域设置与用户web应用程序的区域设置不同。无论如何,这是我们需要能够处理的情况。
那么最简单的处理方式是什么呢?我可以创建自己的Javascript ConvertToStandardNumberFormat(),它接收来自.NET的字符串值并返回“标准”数字格式,但这似乎有点像一个技巧。是否有一种方法可以强制.NET / Razor呈现非本地化格式的数字?
var js_bignum = @price.ToUnlocalizedFormat();  (Is there something like this?)

我正在尝试找出这种情况的最佳做法。谢谢!

3
你能否从 Razor 表达式中调用方法呢?因为这正是 number.ToString(CultureInfo.InvariantCulture) 应该做的事情(当然需要使用正确命名空间的 Razor 语法)。 - millimoose
2个回答

4
我会使用@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 的格式化功能。 - rocketmonkeys

3

如另一个答案所述,一个简单的解决方案是使用 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)时,这样更易于维护,并且可以清楚地表达您的意图。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接