Каков наилучший способ для анализа локализованных номеров из .NET / Razor в JavaScript? - PullRequest
5 голосов
/ 22 ноября 2011

У меня есть приложение .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;

Возможно, это связано с тем, что настройка языка браузера пользователя отличается от настройки языка веб-приложения пользователя.В любом случае, мы должны уметь справляться с такой ситуацией.

Так какой же самый простой способ справиться с этим?Я могу создать свой собственный Javascript ConvertToStandardNumberFormat(), который принимает строковое значение из .NET и возвращает «стандартный» числовой формат, но это выглядит как хак.Есть ли способ заставить .NET / razor визуализировать нелокализованный номер формата?

var js_bignum = @price.ToUnlocalizedFormat();  (Is there something like this?)

Я просто пытаюсь выяснить, каковы лучшие практики для ситуаций такого типа.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 22 ноября 2011

Я бы использовал @price.ToString(CultureInfo.InvariantCulture)

Редактировать

Я должен не согласиться с ответом Жоао и считаю его Плохой Идеей & trade ;. Я бы не рекомендовал заново изобретать колесо. Если вы предпочитаете более комплексный подход, я бы предпочел включить выделенную библиотеку кодирования 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 при каждом вызове помощника.

Но это будет гораздо более гибким (и проверенным), чем свертывание собственного сериализатора в виде статического вспомогательного класса ...

3 голосов
/ 22 ноября 2011

Как уже говорилось в другом ответе, простым решением было бы позвонить ToString с InvariantCulture, однако это не совсем ясно выражает ваше намерение и может побудить людей предположить, что 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).

...