Учитывайте это
#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
, вы не сможете изменить его, но сможете скопировать и получить доступ к нему как к константной ссылке для чтения.
Поскольку установка
на 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>" %>
Когда вы говорите
в моей системе, числа с плавающей запятой хранятся с запятой в качестве десятичного разделителя
Я предполагаю, что вы имеете в виду, что они отформатированы с запятой, числа с плавающей запятой хранятся как с плавающей точкой
.
Хотя вы можете решить проблему форматирования, установив в «Культурах» «реальное» исправление это изменить код. Хорошо, это не ваш код, поэтому, возможно, вы не хотите делать это в этом случае, но для общего ознакомления вы должны убедиться, что при форматировании с плавающей запятой или чем-то еще вы используете соответствующую культуру. В случае форматирования числа для использования 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),
Это должно означать, что вам не нужно вносить исправление, которое вы вставили, и должен исправить другой вопрос. .. где я оставлю комментарий. Надеюсь, это поможет, я не полностью протестировал, потому что я не в вашей стране, но, похоже, это работает.
Я датский разработчик и столкнулся с той же проблемой. Я нашел рабочее решение, которое было любезно описано Кристофом Нейринком в его блоге разработчиков:
С уважением, Финн Вилсбек
Я использую простой квикфикс в TemplateEditor. В моем приложении используется только шведский язык (запятая как десятичный разделитель), поэтому это одна строка.Replace, но вы, конечно, можете сделать так, чтобы она знала о нескольких культурах.
В моем Views/Shared/EditorTemplates/Decimal.ascx: