2012-05-15 1 views
-3

У меня есть следующее значение 48.81, оно приходит в виде строки из базы данных, мне нужно, чтобы преобразовать его в десятичное, я использую:ToDecimal из строки не возвращает ожидаемый результат

Dim Seconds As Decimal = Convert.ToDecimal((Coordinate.Substring(4, 5)), CultureInfo.InvariantCulture) 

Я получаю 4881D и мне нужно 48,81

Любые идеи? Я думал, что CultureInfo.InvariantCulture собирался помочь мне с этим

EDIT

Значение координат является 675900.244. Я "spliting" это так:

Dim Degress As Integer = Coordinate.Substring(0, 2), 
Dim Minutes As Integer = Coordinate.Substring(2, 2), 
Dim Seconds As Decimal = Convert.ToDecimal((Coordinate.Substring(4, 5)), CultureInfo.InvariantCulture), 
Dim Position As Enumerations.EnumCoordinatesPosition = Coordinate.Substring(9, 1) 

EDIT

Showing the error

EDIT

Showing the coordinate

EDIT Это значение координаты в базе данных

Showing the value of the coordinate in the DB

+0

ли строка из базы данных ' "48,81"', а не на самом деле ' "48,81"'? – Guffa

+0

Почему числовое значение появляется в виде строки из базы данных? Большинство dbms могут хранить больше строк ;-) –

+4

Просьба предоставить краткую, но полную программу, демонстрирующую проблему. –

ответ

1

Проблема заключается в переменной databaseCoordinate, которая содержит запятую вместо точки. InvariantCulture использует запятую для разделения групп цифр и точек в виде десятичного символа. Чтобы увидеть это выполнить следующий код:

//outputs '.' 
Console.WriteLine(CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator); 
//outputs ',' 
Console.WriteLine(CultureInfo.InvariantCulture.NumberFormat.NumberGroupSeparator); 

Что вы можете сделать по этому поводу:

  1. Заменить запятую с точкой перед разбором - весь ваш код, то будет работать, как ожидалось.
  2. Укажите десятичный разделитель для Convert.ToDecimal метода, как это:

    decimal Seconds = Convert.ToDecimal((Coordinate.Substring(4, 5)), new NumberFormatInfo { NumberDecimalSeparator = "," }); 
    
  3. Написать скрипт обновления БД для всех записей БД с координатами использовать точку в качестве десятичного символа.

Пример - этот код дает результаты, которые вы ожидаете:

string Coordinate = "100948.811"; //Note the dot instead of comma 
int Degress = Convert.ToInt32(Coordinate.Substring(0, 2)); //10 
int Minutes = Convert.ToInt32(Coordinate.Substring(2, 2)); //9 
decimal Seconds = Convert.ToDecimal((Coordinate.Substring(4, 5)), CultureInfo.InvariantCulture); //48.81 
+0

Но если данные из базы данных поступают с ','? Единственная возможность изменить его на '.'? – Luis

+0

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

+0

DB хранит данные с точками, и вы получаете их запятыми? Любая координата не является строкой в ​​БД или происходит некоторое промежуточное преобразование, о котором вы не знаете. В первом случае, пожалуйста, покажите нам весь соответствующий код - как вы загружаете значения из БД, как вы передаете их показанному методу и т. Д. Во втором случае замена запятой на точку кажется вашим единственным вариантом. – Andrei

-1

Существует проблема, связанная с полученным значением из базы данных; а также проблема с вашим подходом.

Во-первых, если вы ожидаете десятичное значение, то сохраните его как десятичное число в базе данных.

И, во-вторых, вы пытаетесь разобрать строку, которая должна содержать не менее 9 символов. у вас есть всего 5 символов.

(Coordinate.Substring(4, 5)) здесь вы заявляете, что ожидаете не менее 9 символов; у вас есть всего 5 символов.

 Смежные вопросы

  • Нет связанных вопросов^_^