2013-08-22 4 views
0

В моем приложении, у меня есть следующие строки:Лучший способ обработки Convert failures?

double val = Convert.ToDouble(values8[x]) + 24837; 

Если values8[x] не может быть преобразован в Double аварий приложение с ошибкой Input string was not in a correct format.

Как проверить это и установить val на DBNull.Value, если преобразование не выполнено? С помощью try/catch? Будет ли что-то подобное приемлемым?

EDIT: Вот что я пытаюсь сделать

try 
{ 
    double val = Convert.ToDouble(values8[x]) + 24837; 
    com.Parameters.Add("@p1", OleDbType.Date, 255).Value = DateTime.FromOADate(val); 
} 
catch (exception e) 
{ 
    com.Parameters.Add("@p1", OleDbType.Date, 255).Value = DBNull.Value; 
} 

edit2: TryParse является то, что я искал.

+0

http://msdn.microsoft.com/en-us/library/system.double.tryparse.aspx – Leri

+3

'values8 [x]' звучит как кодовый запах для меня. Создайте правильную модель данных, пожалуйста. –

+0

Существуют различные методы '.TryParse'. – Arran

ответ

5

Вы бы лучше использовать double.TryParse метод вместо попытки и ловли, которые могут быть более дорогими:

double val; 
if (double.TryParse(values8[x], out val)) 
{ 
    // you can safely use the val variable here 
} 
else 
{ 
    // parsing failed 
} 

У вас также есть возможность указать культуру, если вы знаете, это заранее (вы знаете, как вещь десятичный разделитель может быть различным для разных культур, ...):

double val; 
var culture = new CultureInfo("fr-FR"); 
if (double.TryParse(values8[x], NumberStyles.None, culture, out val)) 
{ 
    // you can safely use the val variable here 
} 
else 
{ 
    // parsing failed 
} 
+0

Вы также должны указать nullables, так как он хочет установить результат в «DBNull.Value» в случае ошибок синтаксического анализа, который не работает. –

+0

Непонятно, из чего стоит вопрос «DBNull.Value», поэтому я предпочел не говорить об этом. –

+0

Действительно ли это, что 'TryParse' дешевле ручного' Try/Catch'? Использует ли он не только обработку исключений под капотом? – Rotem

1

двойных имеет метод TryParse, который должен быть использован. если синтаксический анализ будет успешным, чем значение val получит значение, значение else не будет присвоено val. Исключение не будет выброшено

double val; 

if(double.TryParse(values8[x], out val)) 
{ 
    Console.WriteLine("Parsing successful"); 
} 
else 
{ 
    Console.WriteLine("Parsing failed"); 
} 
1

По вашему редактирования вам это нужно:

double val; 

if (!Double.TryParse(values8[x], out val)) 
    com.Parameters.Add("@p1", OleDbType.Date, 255).Value = DBNull.Value; 
else 
    com.Parameters.Add("@p1", OleDbType.Date, 255).Value = DateTime.FromOADate(val + 24837);