UPDATE
Проблема была в локали пользователя!
Я разобрал проблему с
double lat = double.Parse(Request.Form["lat"], CultureInfo.InvariantCulture);
Актуальный вопрос
Это моя первая попытка определить местоположение на моем мобильном сайте. Я получаю местоположение пользователя с его телефона с помощью w3 geolocation API и конвертирую его в double, а затем сохраняю как float в sqlserver.
В большинстве случаев работает нормально, но в некоторых случаях координаты, предоставляемые телефоном, довольно длинные. Например, широта может быть 3.1234567890123
, поэтому 14 чисел после точки.
Это сохраняется как 3.1234567890123+E16
и вызывает ошибку в заголовке, когда я пытаюсь вычислить расстояние пользователя до определенной точки.
Каков наилучший способ избежать этого? Должен ли я обрезать ввод от пользователя до определенной длины, чтобы он был правильно преобразован?
Способ получения и сохранения данных
double lat = Convert.ToDouble(Request.Form["lat"]);
double lng = Convert.ToDouble(Request.Form["lng"]);
user.UpdateMyLocationCoordinates(user.id, lat, lng);
public void UpdateMyLocationCoordinates(int userId, double lat, double lng)
{
SiteDbHelper db = new SiteDbHelper();
List<SqlParameter> sqlParameters = new List<SqlParameter>();
sqlParameters.Add(db.CreateParameter("@userId", SqlDbType.Int, userId));
sqlParameters.Add(db.CreateParameter("@latitude", SqlDbType.Float, lat));
sqlParameters.Add(db.CreateParameter("@longitude", SqlDbType.Float, lng));
db.UpdateInsertDeleteReturnAffectedRowCount ("SocialSiteUser_UpdateMyLocationCoordinates", CommandType.StoredProcedure, sqlParameters);
}
CreateParameter
public SqlParameter CreateParameter(string name, SqlDbType type, double value)
{
SqlParameter param = new SqlParameter(name, value);
param.SqlDbType = type;
return param;
}
SP o хранить данные
ALTER PROCEDURE [dbo].[SocialSiteUser_UpdateMyLocationCoordinates]
@userId int,
@latitude float,
@longitude float
AS
BEGIN
SET NOCOUNT ON
update domains_users set latitude=@latitude, longitude=@longitude where id=@userId
END