Вспомогательные функции для безопасного преобразования из строк - PullRequest
10 голосов
/ 04 октября 2008

Вернувшись в VB6, я написал несколько функций, которые позволили бы мне кодировать, не заботясь о разнице между нулями и '' для строк, нулями и 0 для чисел и т. Д. Ничто не убивает мою производительность больше при кодировании, чем необходимость добавить специальный код случая для работы с данными, которые могут вызвать некоторую не относящуюся к делу ошибку; 9999/10000, если что-то, что я использую в качестве числа, является нулевым, то на самом деле я рассматриваю это как 0.

Я сейчас на C #, и разница между VB6 и C # 2005 довольно велика ... поэтому я не знаю, с чего начать писать свой новый набор вспомогательных функций, или мне даже нужно это сделать их вообще.

Итак, мне нужно написать функцию, которая будет принимать строку, поле базы данных, форму запроса / поле запроса, ???, а затем делать все возможное, чтобы превратить это в Double, и вернуть это вызывающая процедура.

Мне также нужно было бы сделать это для шортов, int16, int32, long, всего остального, что меня могло волновать.

Тогда я бы сделал это для строк. И даты.

Это стоящее занятие? Есть ли что-то в рамках или C #, что я могу использовать вместо этого? Я действительно желаю чего-то такого, что позволило бы мне использовать встроенные данные при вызове других функций, без необходимости создавать временные переменные и т. Д.

Ответы [ 4 ]

35 голосов
/ 04 октября 2008

Есть множество встроенных функций преобразования. Но ... я не уверен, что кто-то из них делает именно то, что вы хотите. Как правило, методы .NET допускают ошибку, когда передают неверный ввод, и выдают исключение.

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

public static T SafeConvert<T>(string s, T defaultValue)
{
    if ( string.IsNullOrEmpty(s) )
        return defaultValue;
    return (T)Convert.ChangeType(s, typeof(T));
}

Использование:

SafeConvert(null, 0.0) == 0.0;
SafeConvert("", 0.0) == 0.0;
SafeConvert("0", 0.0) == 0.0;

Этот универсальный метод берет свой тип возврата из типа второго аргумента, который используется в качестве значения по умолчанию, когда переданная строка равна нулю или пуста. Пройдите 0, и вы получите In32 назад. Пропуск 0L, Int64. И так далее ...

6 голосов
/ 04 октября 2008

В C # большинство типов данных не обнуляются (числа, даты и т. Д.), Только строки могут обнуляться. Если вы получаете данные из БД, то вы, вероятно, будете работать с Nullable или его синтаксически-подслащенной версией int?

Все обнуляемые значения имеют метод , который позволяет вам получить их фактическое значение или значение по умолчанию, если они равны нулю. Это должно помочь вам избежать создания этих функций.

Что касается строк, у вас есть функция String.IsNullOrEmpty (str).

Вы также можете добавить методы расширения , если вам нужны специальные недоступные функции. Обратите внимание, что методы расширения могут применяться к нулевым значениям, если вы обрабатываете их в коде. Например:

public static string ValueOrDefault(this string str) 
{
     if (String.IsNullOrEmpty(str)) return MY_DEFAULT_VALUE;
     else return str;
}
1 голос
/ 21 ноября 2016

Я думаю, что это похоже на @ Shog9. Я просто добавляю try catch для обработки необычного пользовательского ввода. Я посылаю тип, в который я хочу преобразовать входные данные и принимаю их как объект

public static class SafeConverter
{
   public static T SafeConvert<T>(object input, T defaultValue)
   {
       if (input == null)
          return defaultValue; //default(T);

       T result;
       try
       {
           result = (T)Convert.ChangeType(input.ToString(), typeof(T));
       }
       catch
       {
          result = defaultValue; //default(T);
       }
       return result;
   }
} 

Теперь назовите их как ниже

SafeConverter.SafeConvert<ushort>(null, 0);
SafeConverter.SafeConvert<ushort>("", 0);
SafeConverter.SafeConvert<ushort>("null", 0);
SafeConverter.SafeConvert<ushort>("-1", 0);
SafeConverter.SafeConvert<ushort>("6", 0);
SafeConverter.SafeConvert<ushort>(-1, 0);
SafeConverter.SafeConvert<ushort>(0, 0);
SafeConverter.SafeConvert<ushort>(1, 0);
SafeConverter.SafeConvert<ushort>(9, 0);
1 голос
/ 04 октября 2008

В библиотеке .NET есть класс Convert. Он имеет функции, которые позволяют вам конвертировать во что угодно из любого базового типа и нескольких общих классов (например, DateTime.)

В основном это работает как Convert.ToInt32 (val);

РЕДАКТИРОВАТЬ: Мне действительно нужно научиться читать все слова. Не уловил беспокойство по поводу нуля ... для этого есть оператор. Вы можете использовать ?? проверить на ноль и указать значение по умолчанию, чтобы оно могло работать.

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

...