System.FormatException: 24201: значения широты должны быть от -90 до 90 градусов.

ОБНОВИТЬ

Проблема заключалась в локали пользователя! Я решил проблему с

double lat = double.Parse(Request.Form["lat"], CultureInfo.InvariantCulture);

Актуальный вопрос

Это моя первая попытка реализовать местоположение на моем мобильном сайте. Я получаю местоположение пользователя со своего телефона с помощью API геолокации w3 и конвертирую его в 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

person nLL    schedule 05.12.2011    source источник
comment
Вы должны опубликовать свой ввод, вычисление, которое вы выполняете, и фактическую часть, в которой вы форматируете результат.   -  person NotMe    schedule 05.12.2011
comment
Слишком много цифр не имеет ничего общего с диапазоном -90 ... 90.   -  person Henk Holterman    schedule 05.12.2011
comment
Я отправляю сообщения со своего телефона, но обновил вопрос, указав точную широту. Обновим остаток битового слоя   -  person nLL    schedule 05.12.2011
comment
E+16 это твоя проблема. Вы где-то теряете десятичную точку?   -  person Rup    schedule 05.12.2011
comment
Я конвертирую ввод в двойной формат и сохраняю на SQL-сервере. Тип данных - плавающий в столбце SQL-сервера   -  person nLL    schedule 05.12.2011
comment
Параметр в сохраненном продукте - @lat float   -  person nLL    schedule 05.12.2011
comment
Следующий вопрос: что вызывает вашу хранимую процедуру и какой тип данных она передает? Другими словами, вы конвертируете его в тип varchar / char, а затем пытаетесь передать его процедуре?   -  person NotMe    schedule 05.12.2011
comment
Я обновил свой вопрос с подробностями   -  person nLL    schedule 05.12.2011


Ответы (2)


Проблема заключалась в локали пользователя! Я решил проблему с

 double lat = double.Parse(Request.Form["lat"], CultureInfo.InvariantCulture);
person nLL    schedule 05.12.2011

Хотя 3.1234567890123+E16 является допустимым числом с плавающей запятой, оно намного больше 90, поэтому не является допустимой широтой, которая должна находиться между -90 и +90 градусами.

Кроме того, 3.1234567890123 на самом деле 3.1234567890123+E01, поэтому я не уверен, как оно умножается на 10^16 при преобразовании, чтобы стать 3.1234567890123+E16.

person Cade Roux    schedule 05.12.2011
comment
фактические сохраненные значения: 3.9951341674225E + 16, 3.27377879977052E + 16 - person nLL; 05.12.2011
comment
@nLL Это недопустимые значения широты (или долготы). Какова точная строка в запросе [широта]? - person Cade Roux; 05.12.2011
comment
@nLL, например, 3.9951341674225E + 16 примерно эквивалентен 39951341674225000 (в приведенных вами примерах всего 14 цифр точности), поэтому, если у вас есть 17-значное число без десятичной дроби, это будет X.XXXXE +16 в экспоненциальном представлении. - person Cade Roux; 05.12.2011
comment
спасибо, я связался с пользователем и провел с ними тесты, чтобы узнать, что происходит. Буду обновлять дальше. - person nLL; 05.12.2011
comment
Наконец! Мне удалось заставить его работать, используя @lat float (53) вместо @lat float в SP - person nLL; 05.12.2011