Модераторы: ginnie, korob2001
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как отличить число от не-числа? 
:(
    Опции темы
ilya_evseev
  Дата 30.10.2004, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.10.2004

Репутация: нет
Всего: нет



Как определить, что переменная содержит число?
Сейчас я пытаюсь сделать это так:

sub enquote_value($) {
$_ = shift;
no warnings 'numeric';
return $_ unless ($_ == 0) && ($_ ne "0");
s/'/\\'/g; # escape internal quotes..
'\'' . $_ . '\''; # put external quotes..
}

Однако этот вариант считает, например, ip-адрес числом.

P.S. Зачем мне это потребовалось? Чтобы при конструировании SQL-запроса строковые поля заключать в кавычки, а числовые - нет. Если определить по значению, число это или нет, Перл не позволяет, во все подпрограммы придётся отдельным параметром сообщать типы столбцов - слишком монстроидально.
PM MAIL   Вверх
Forza
Дата 30.10.2004, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 12.9.2004

Репутация: нет
Всего: 2



Натрави на него регэксп, который зависит от формата того, что хочешь считать числами.
Например, проверка
Код
if ($number =~ /^[+-]?\d+$/)
{ print ("it is целое число"); }
определит является ли содержимое строки целым числом, в начале которого может стоять плюс, минус или вообще ничего. Ессно, надо предварительно убрать возможные пробелы с начала и конца или проверять с учётом их:
Код
if ($number =~ /^\s*[+-]?\d+\s*$/)
{ print ("it is целое число"); }


Если же числа могут быть как дробными, так и целыми, то подойдёт такая проверка:
Код
if ($number =~ /^\s*[+-]?\d+(\.\d+)?\s*$/)
{ print ("it is число"); }

Т.е. тут после целой части может быть, а может и не быть точка с как минимум одним числом.

Если хочешь также считать числами строки типа ".123" или "1.23E-01", то придумывай сам им регэкспы. :)

Это сообщение отредактировал(а) Forza - 30.10.2004, 11:25
PM MAIL   Вверх
Secandr
Дата 30.10.2004, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



Код
if (($a+0) eq $a) {print "число";}
или
if (($a+0) == $a) {print "число";}


Надо тестить.
Добавлено @ 11:33
Forza Проще надо быть....


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Forza
Дата 30.10.2004, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 12.9.2004

Репутация: нет
Всего: 2



Secandr, согласен. А то я привык всё подряд проверять регэкспами. Очень уж они мне нравятся! :)

Имхо из предложенного тобой надо брать вариант со сравнением через "==", т.к. мы пытаемся воспринимать переменную именно как число!

Это сообщение отредактировал(а) Forza - 30.10.2004, 12:15
PM MAIL   Вверх
Secandr
Дата 30.10.2004, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



Forza Насамом деле должны работать оба способа.

А с регекспами знакомая ситуация. Скорей всего ты их нежавно выучил :)

Вещь класная, я сам с полгода искал простые слова регекспами :) Но вроде стал отходить...


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Nobody
Дата 30.10.2004, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

Репутация: нет
Всего: 16



Код
$a += 0;


Отныне $a - число :)


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
ilya_evseev
  Дата 31.10.2004, 02:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.10.2004

Репутация: нет
Всего: нет



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

sub dbi_quote($$) {
   my $dbh = shift;
   $_ = shift;

   no warnings 'numeric';
   return $_ if (($_ + 0) eq $_);

   return $dbh->quote($_) if $dbh;

   s/'/''/g;   # escape internal quotes..
   '\'' . $_ . '\'';   # put external quotes..
}

Что касается регэкспов, то описывать ими форматы чисел, на мой взгляд, нерационально: они могут быть и вещественные, и целые, и 16-ричные и хрен знает какие ещё. Получается и громоздко, и ненадёжно, и без помощи Перла.
PM MAIL   Вверх
Secandr
Дата 31.10.2004, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



Nobody
Код
$a += 0;

Я тоже всегда так делаю, это позволяет избежать проверок.

А проверка правельнее
Код
if (($a+0) eq $a) {print "число";}


Поскольку в случае

Код
if (($a+0) == $a) {print "число";}


$a='fuck' будет числом :)


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Sadok
Дата 2.11.2004, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 2.11.2004

Репутация: нет
Всего: 2



ilya_evseev
Цитата

Чтобы при конструировании SQL-запроса строковые поля заключать в кавычки, а числовые - нет.

use DBI;
my $db = DBI -> connect ('DBI:mSQL:mydata', user, pass);
my $string = "Bla-bla";
my $string2 = "123";
my $qs = $db -> quote($string);
my $qs2 = $db -> quote($string2);
# теперь обе строки годятся для использования в командах для своих СООТВЕТСТВУЮЩИХ серверов баз данных

PM   Вверх
ElectricalStorm
Дата 2.11.2004, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 547
Регистрация: 22.1.2004

Репутация: 1
Всего: 9



ИМХО Forza единственно правильный совет дал ...


--------------------
Нужно знать инструмент, которым пользуешься
PM MAIL   Вверх
Secandr
Дата 2.11.2004, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: нет
Всего: 39



ElectricalStorm Политически корректнее брать eq


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0494 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.