Как получить тип элемента записанного как строка?
Есть у меня такая необходимость, преобразовывать элементы записанные как строка в другие типы (int, float, double, char[] и прочее).
Т.е. есть к примеру строка "12.4561258 asddsa 56 2.654852159753"
Можно ли как-то не прибегая к попыткам конвертануть в численные типы или посимвольному разбору элемента, узнать что 12.4561258 это float, asddsa это string или char[], 56 это int и 2.654852159753 это double?
Да и почему-то мне кажется, что если попытаться конвертануть string s = "2.654852159753" к int, то и получится int, а не double.
А если конвертануть 56 к double, то и получится 56 и 12 нулей после точки. Видимо попытки конвертации вообще не катят.
Есть у меня такая необходимость, преобразовывать элементы записанные как строка в другие типы (int, float, double, char[] и прочее).
Т.е. есть к примеру строка "12.4561258 asddsa 56 2.654852159753"
Можно ли как-то не прибегая к попыткам конвертануть в численные типы или посимвольному разбору элемента, узнать что 12.4561258 это float, asddsa это string или char[], 56 это int и 2.654852159753 это double?
Да и почему-то мне кажется, что если попытаться конвертануть string s = "2.654852159753" к int, то и получится int, а не double.
А если конвертануть 56 к double, то и получится 56 и 12 нулей после точки. Видимо попытки конвертации вообще не катят.
В Builder'е есть функция типа TryStrToFloat, TryStrToBool и т.д. Если время выполнения не критично, то можно выделять группы символов разделенные пробелом и поочередно пытаться конвертировать их... Если время критично, то конечный автомат.
На счет конвертации я уже описал проблему:
Число 56 конвертанется и в int и в float и в double. Так какого оно типа? *PARDON*
На счет конечного автомата не понял %) Это что за зверь? Что-то такое было в дискретной математике что ли
На счет конвертации я уже описал проблему:
Число 56 конвертанется и в int и в float и в double. Так какого оно типа? *PARDON*
На счет конечного автомата не понял %) Это что за зверь? Что-то такое было в дискретной математике что ли
в try - catch заключаешь
Convert.To_По_Желанию()
Уже обяснил, попадется там 56
в трай кетче заключаю
конвертирую в int - Норм (результат 56)
конвертирую в float - Норм (результат 56.000000)
конвертирую в double - Норм (результат 56.000000000000)
Так и какого типа было 56?
тоже самое есть 15.156325
В трай кетч заключаю
конвертирую в int - Норм (результат 15)
конвертирую в float - Норм (результат 15.156325)
конвертирую в double - Норм (результат 15.156325000000)
Так и какого типа было 15.156325?
Уже обяснил, попадется там 56
в трай кетче заключаю
конвертирую в int - Норм (результат 56)
конвертирую в float - Норм (результат 56.000000)
конвертирую в double - Норм (результат 56.000000000000)
Так и какого типа было 56?
тоже самое есть 15.156325
В трай кетч заключаю
конвертирую в int - Норм (результат 15)
конвертирую в float - Норм (результат 15.156325)
конвертирую в double - Норм (результат 15.156325000000)
Так и какого типа было 15.156325?
о типе можно узнать по наличию/отсутствию точки и количеству знаков после нее
На счет конечного автомата не понял %) Это что за зверь? Что-то такое было в дискретной математике что ли
Вот пример конечного автомата на распознавание чисел... Писал давно, сфотал свои наброски, думаю все будет понятно... Автомат переходит из состояния в состояние только по стрелкам, каждый новый символ - переход по стрелке, будет непонятно спрашивайте... Двойным кружком - конечные состояния, т.е. распознано число...
P.S. два последних состояния, если в экспоненте может стоять дробное число
P.P.S. не знаю стоит ли Ваша задача такой замуты :)
По сути не многим отличается от посимвольного перебора, но сам факт использования конечных автоматов будет большим плюсом lol
Хоть и хотелось бы что-то автоматическое :)
вот мечта:
Object obj = "15.153568";
if (obj.GetType() == float)
Console.WriteLine("obj is instance of float");
Жаль не осуществимая, ибо obj.GetType() возвращает в данном случае System.String
P.S. кстати, что за перебор? Все равно надо запоминать какие символы уже были - все в итоге выльется именно в конечный автомат...
{
public NamedRegex(string name, string pattern)
{
Name = name;
Regex = new Regex(pattern);
}
public readonly string Name;
public readonly Regex Regex;
}
void main()
{
string input = "12.4561258 asddsa 56 2.654852159753";
System.Globalization.NumberFormatInfo numericInfo =
System.Globalization.NumberFormatInfo.InvariantInfo;
NamedRegex[] regexions =
{
new NamedRegex("Double", "^[+-]?\\d+[" + numericInfo.CurrencyDecimalSeparator + "]\\d*$"),
new NamedRegex("Decimal", "^[+-]?\\d+$"),
new NamedRegex("String", "^.*$")
};
string[] entries = input.Split(' ');
foreach (string entry in entries)
{
foreach (NamedRegex regex in regexions)
{
if (regex.Regex.IsMatch(entry))
{
Console.WriteLine(string.Format("{0}: {1}", regex.Name, entry));
break;
}
}
}
}
P.S. Вариант с try/catch - не рационально и не логично. Не имейте привычки использовать исключения для управления потоком выполнения.
Только должно быть так для double new NamedRegex("Double", "^[+-]?\\d+[" + numericInfo.CurrencyDecimalSeparator + "]{1}\\d{12}$"),
иначе 2. тоже считается за double
М... появился один вопрос, а как поведет себя эта штука, если допустим число по синтаксису как double окажется больше чем Double.MaxValue? Можно как-то прикрутить макс значение в регулярное выражение?
иначе 2. тоже считается за double[/QUOTE]Ну, я по аналогии с компилятором :) Правда там и .2 тоже за double считается...[QUOTE=Lei fang]М... появился один вопрос, а как поведет себя эта штука, если допустим число по синтаксису как double окажется больше чем Double.MaxValue? Можно как-то прикрутить макс значение в регулярное выражение?[/QUOTE]Вы можете задать диапазоны количества знаков для каждой части в паттерне. Далее, вы можете выделять именованные группы в паттернах (например, целая часть - дробная часть) и запрашивать их по отдельности (свойство Match.Groups) с целью анализа (например, если количество знаков целой части анализируемого числа равно количеству знаков целой части максимального значения, просто сравниваете их посимвольно).
Применительно к вашей задаче, регулярки изучаются на одном дыхании, и официальной документации для введения подобных наворотов должно хватить :)