Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как получить тип элемента записанного как строка?

408
22 января 2009 года
Lei fang
265 / / 01.10.2005
Здравствуйте.
Есть у меня такая необходимость, преобразовывать элементы записанные как строка в другие типы (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 нулей после точки. Видимо попытки конвертации вообще не катят.
1.9K
22 января 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: Lei fang
Здравствуйте.
Есть у меня такая необходимость, преобразовывать элементы записанные как строка в другие типы (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 и т.д. Если время выполнения не критично, то можно выделять группы символов разделенные пробелом и поочередно пытаться конвертировать их... Если время критично, то конечный автомат.

408
22 января 2009 года
Lei fang
265 / / 01.10.2005
Забыл сказать что мне это надо делать на .NET языках. Именно на C#, но это не важно по идее.
На счет конвертации я уже описал проблему:
Число 56 конвертанется и в int и в float и в double. Так какого оно типа? *PARDON*

На счет конечного автомата не понял %) Это что за зверь? Что-то такое было в дискретной математике что ли
11
22 января 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Lei fang
Забыл сказать что мне это надо делать на .NET языках. Именно на C#, но это не важно по идее.
На счет конвертации я уже описал проблему:
Число 56 конвертанется и в int и в float и в double. Так какого оно типа? *PARDON*

На счет конечного автомата не понял %) Это что за зверь? Что-то такое было в дискретной математике что ли


в try - catch заключаешь
Convert.To_По_Желанию()

408
22 января 2009 года
Lei fang
265 / / 01.10.2005
Но мне не нужно по желанию. Мне нужно именно так как есть. Я ведь совершенно не знаю какого типа будет элемент в строке.
Уже обяснил, попадется там 56
в трай кетче заключаю
конвертирую в int - Норм (результат 56)
конвертирую в float - Норм (результат 56.000000)
конвертирую в double - Норм (результат 56.000000000000)
Так и какого типа было 56?

тоже самое есть 15.156325
В трай кетч заключаю
конвертирую в int - Норм (результат 15)
конвертирую в float - Норм (результат 15.156325)
конвертирую в double - Норм (результат 15.156325000000)
Так и какого типа было 15.156325?
11
22 января 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Lei fang
Но мне не нужно по желанию. Мне нужно именно так как есть. Я ведь совершенно не знаю какого типа будет элемент в строке.
Уже обяснил, попадется там 56
в трай кетче заключаю
конвертирую в int - Норм (результат 56)
конвертирую в float - Норм (результат 56.000000)
конвертирую в double - Норм (результат 56.000000000000)
Так и какого типа было 56?

тоже самое есть 15.156325
В трай кетч заключаю
конвертирую в int - Норм (результат 15)
конвертирую в float - Норм (результат 15.156325)
конвертирую в double - Норм (результат 15.156325000000)
Так и какого типа было 15.156325?


о типе можно узнать по наличию/отсутствию точки и количеству знаков после нее

1.9K
22 января 2009 года
GreenRiver
451 / / 20.07.2008
Цитата: Lei fang

На счет конечного автомата не понял %) Это что за зверь? Что-то такое было в дискретной математике что ли



Вот пример конечного автомата на распознавание чисел... Писал давно, сфотал свои наброски, думаю все будет понятно... Автомат переходит из состояния в состояние только по стрелкам, каждый новый символ - переход по стрелке, будет непонятно спрашивайте... Двойным кружком - конечные состояния, т.е. распознано число...

P.S. два последних состояния, если в экспоненте может стоять дробное число
P.P.S. не знаю стоит ли Ваша задача такой замуты :)

408
22 января 2009 года
Lei fang
265 / / 01.10.2005
Крутая вещь :P
По сути не многим отличается от посимвольного перебора, но сам факт использования конечных автоматов будет большим плюсом lol

Хоть и хотелось бы что-то автоматическое :)

вот мечта:
Object obj = "15.153568";
if (obj.GetType() == float)
Console.WriteLine("obj is instance of float");
Жаль не осуществимая, ибо obj.GetType() возвращает в данном случае System.String
1.9K
22 января 2009 года
GreenRiver
451 / / 20.07.2008
Создайте наследника Object, создайте какой-нибудь метод, а в нем реализуйте как нравится. Хоть "автоматами", хоть try...catch с дополнительной проверкой на наличие запятой... И будем счастье :)

P.S. кстати, что за перебор? Все равно надо запоминать какие символы уже были - все в итоге выльется именно в конечный автомат...
341
23 января 2009 года
Der Meister
874 / / 21.12.2007
[QUOTE=Lei fang]Забыл сказать что мне это надо делать на .NET языках. Именно на C#, но это не важно по идее.[/QUOTE].NET дарит праздник в каждом доме как Coca-cola: регулярки рулят.
Код:
struct NamedRegex
{
    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;
            }
        }
    }
}
Вообще, такие сопоставления гораздо проще проводить на функциональных/смешанных языках вроде Haskell или Nemerle - код становится буквально в три строки.
P.S. Вариант с try/catch - не рационально и не логично. Не имейте привычки использовать исключения для управления потоком выполнения.
408
26 января 2009 года
Lei fang
265 / / 01.10.2005
Хм, тоже крутая вещь :) Благодарю
Только должно быть так для double new NamedRegex("Double", "^[+-]?\\d+[" + numericInfo.CurrencyDecimalSeparator + "]{1}\\d{12}$"),
иначе 2. тоже считается за double

М... появился один вопрос, а как поведет себя эта штука, если допустим число по синтаксису как double окажется больше чем Double.MaxValue? Можно как-то прикрутить макс значение в регулярное выражение?
341
27 января 2009 года
Der Meister
874 / / 21.12.2007
[QUOTE=Lei fang]Только должно быть так для double new NamedRegex("Double", "^[+-]?\\d+[" + numericInfo.CurrencyDecimalSeparator + "]{1}\\d{12}$"),
иначе 2. тоже считается за double[/QUOTE]Ну, я по аналогии с компилятором :) Правда там и .2 тоже за double считается...[QUOTE=Lei fang]М... появился один вопрос, а как поведет себя эта штука, если допустим число по синтаксису как double окажется больше чем Double.MaxValue? Можно как-то прикрутить макс значение в регулярное выражение?[/QUOTE]Вы можете задать диапазоны количества знаков для каждой части в паттерне. Далее, вы можете выделять именованные группы в паттернах (например, целая часть - дробная часть) и запрашивать их по отдельности (свойство Match.Groups) с целью анализа (например, если количество знаков целой части анализируемого числа равно количеству знаков целой части максимального значения, просто сравниваете их посимвольно).
Применительно к вашей задаче, регулярки изучаются на одном дыхании, и официальной документации для введения подобных наворотов должно хватить :)
408
27 января 2009 года
Lei fang
265 / / 01.10.2005
Угу. Премного благодарен. Вопрос исчерпан : )
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог