Как глобализировать ASP.NET представления MVC (десятичные разделители в особенности)?

Учитывайте это

#include <iostream>

int f(int num) { return num+1; }
int fr(int& num) { return num+1; }
int fcr(const int& num) { return num+1; }

class D
{
public:
    int value= 0;

public:
    void f1() { value++; }
    int f2() const { return value; }
    int f3() { return value; }
    static void f4() { std::cout << "Hello" << std::endl; }
    void f5() const;
};

void D::f5() const
{
    // Prohibited:
    // f1(); // modifies this
    // f3(); // might modify this
    // value++; // modifies this->value, thus modifies this
    // value= 2; // modifies this->value, thus modifies this
    // value= abs(value); // modifies this->value, thus modifies this
    // fr(value); // takes value by reference and might modify it
    // 
    // Permitted:
    f2(); // const function, does not modify this
    std::cout << value << std::endl; // independent function, does not modify this; read access to this->value is const
    std::cout << abs(value) << std::endl; // independent function, does not modify this; read access to this->value is const
    f4(); // static function, does not modify this
    f(value); // function, does not modify this; takes value as read only (makes copy)
    fcr(value); // function, does not modify this; takes value as read only by reference

    D otherObject;
    otherObject.f1(); // modifies otherObject (non const), does not modify this
}

int main()
{
    const D d;
    d.f5();
}

Всякий раз, когда вы вызываете функцию-член, например, f4() внутри f5(), вы передаете неявный указатель this, эквивалентный this->f4(). Внутри f5(), как и в const, это не тип D*, а const D*. Таким образом, вы не можете сделать value++ (эквивалентно this->value++ для const D*. Но вы можете вызвать abs, printf или что-то еще, что не берет this и пытается изменить его). [1122 ]

Когда вы берете this->value, если тип this равен D*, это тип int, и вы можете изменить его. Если вы сделаете то же самое с const D*, его тип станет const int, вы не сможете изменить его, но сможете скопировать и получить доступ к нему как к константной ссылке для чтения.

5
задан Pawel Krakowiak 17 April 2009 в 12:43
поделиться

4 ответа

Поскольку установка на en-US вообще не помогла, я решил создать собственный класс, который инициализирует правильные настройки культуры и следит за тем, чтобы все представления которые требуют этого поведения, унаследованы от моего пользовательского класса.

NerdDinnerViewPage.cs:

using System.Globalization;
using System.Threading;
using System.Web.Mvc;

namespace NerdDinner.Views
{
    public class NerdDinnerViewPage<T> : ViewPage<T> where T : class
    {
        protected override void InitializeCulture()
        {
            base.InitializeCulture();

            Thread.CurrentThread.CurrentCulture = Thread.CurrentThread.CurrentCulture.Clone() as CultureInfo;

            if (Thread.CurrentThread.CurrentCulture != null)
            {
                Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator = ".";
                Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator = ".";
            }
        }
    }
}

Edit.aspx:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="NerdDinner.Views.NerdDinnerViewPage<NerdDinner.Models.DinnerFormViewModel>" %>
2
ответ дан 15 December 2019 в 01:10
поделиться

Когда вы говорите

в моей системе, числа с плавающей запятой хранятся с запятой в качестве десятичного разделителя

Я предполагаю, что вы имеете в виду, что они отформатированы с запятой, числа с плавающей запятой хранятся как с плавающей точкой .

Хотя вы можете решить проблему форматирования, установив в «Культурах» «реальное» исправление это изменить код. Хорошо, это не ваш код, поэтому, возможно, вы не хотите делать это в этом случае, но для общего ознакомления вы должны убедиться, что при форматировании с плавающей запятой или чем-то еще вы используете соответствующую культуру. В случае форматирования числа для использования API вы должны использовать InvariantCulture.

Т.е. использовать foo.ToString (CultureInfo.InvariantCulture) вместо foo.ToString () и аналогично при использовании string.Format (...).

Редактировать Я только что взглянул на код NerdDinner и понял, что эта ошибка в Javascript, а не в C #, поэтому мой код выше не поможет. Я не знаю, возможно ли форматировать числа в Javascript, но реальное решение, которое я думаю, это исправить код модели, чтобы она возвращала правильно отформатированную строку.

Редактировать 2 Я бы посоветовал вам попробовать следующее: В SearchController.cs измените Широта и Долгота в JsonDinner на строки . т.е.

public class JsonDinner {
    public int      DinnerID    { get; set; }
    public string   Title       { get; set; }
    public string   Latitude    { get; set; }
    public string   Longitude   { get; set; }
    public string   Description { get; set; }
    public int      RSVPCount   { get; set; }
}

Затем прокрутите вниз до метода SearchByLocation и измените строки широты / долготы, чтобы правильно отформатировать строки для JavaScript:

Latitude = dinner.Latitude.ToString(CultureInfo.InvariantCulture),
Longitude = dinner.Longitude.ToString(CultureInfo.InvariantCulture),

Это должно означать, что вам не нужно вносить исправление, которое вы вставили, и должен исправить другой вопрос. .. где я оставлю комментарий. Надеюсь, это поможет, я не полностью протестировал, потому что я не в вашей стране, но, похоже, это работает.

0
ответ дан 15 December 2019 в 01:10
поделиться

Я датский разработчик и столкнулся с той же проблемой. Я нашел рабочее решение, которое было любезно описано Кристофом Нейринком в его блоге разработчиков:

Custom Model Binder

С уважением, Финн Вилсбек

2
ответ дан 15 December 2019 в 01:10
поделиться

Я использую простой квикфикс в TemplateEditor. В моем приложении используется только шведский язык (запятая как десятичный разделитель), поэтому это одна строка.Replace, но вы, конечно, можете сделать так, чтобы она знала о нескольких культурах.

В моем Views/Shared/EditorTemplates/Decimal.ascx:

0
ответ дан 15 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: