Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2011, 09:58   #1
Aleskandr
Пользователь
 
Регистрация: 13.02.2011
Сообщений: 82
По умолчанию Как найти число в строке? PHP

Дано: строка, в которой содержатся слова и числа(int, float).
Задача: привести все числа в строке к вещественным с двумя знаками после запятой.
Подскажите как можно осуществить?
Aleskandr вне форума Ответить с цитированием
Старый 12.06.2011, 19:30   #2
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Как-то так ?
PHP код:
$t="fds2.l2.1kg23lkj33wqr423.3233242lnln . w;rjn342relkfndsf";
echo 
$t."\n";
$c="\\1";$d="[0-9]";$e="\\.";
$a="~([0-9$e]+)| $e | ($d+$e$d{2,2})($d+) | ($d+$e$d{1,1}) | ($d+)$e | ($d+) ~";
$a=explode("|",implode("~|~",explode("|",$a)));
$b=explode("|",$c |.|$c|\\010|$c.00|$c.00");
$t=preg_replace($a,$b,$t);
echo 
$t."\n"
* Запись вида "2." читается как "2.00", а не как "2.00.". Это легко меняется измерением одного из реджексных выражений.

Вывод:
Код:
fds2.l2.1kg23lkj33wqr423.3233242lnln . w;rjn342relkfndsf
fds2.00l2.10kg23.00lkj33.00wqr423.32lnln . w;rjn342.00relkfndsf
И не надо считать меня извращенцем, и да, я знаю, тут парсер хотели, мне просто интересно было с реджексом поиграться

Последний раз редактировалось graymaster; 12.06.2011 в 19:47. Причина: Дополнение и исправление
graymaster вне форума Ответить с цитированием
Старый 13.06.2011, 08:39   #3
Aleskandr
Пользователь
 
Регистрация: 13.02.2011
Сообщений: 82
По умолчанию

Спасибо большое! Ничего не смыслю в регулярных выражениях( Надо срочно изучать.
А как дописать код, чтобы он не только на точку реагировал, но и на запятую?
Aleskandr вне форума Ответить с цитированием
Старый 13.06.2011, 12:34   #4
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Только для запятой в качестве разделительного знака:
PHP код:
$t="fds2, 2,1kg23lkj33wqr423,323,3242lnln , w;rjn342relkfndsf";
echo 
$t."\n";
$c="\\1";$d="[0-9]";$e=",";
$a="~([0-9$e]+)| $e |$e($d+)$e| ($d+$e$d{2,2})($d+) | ($d+$e$d{1,1}) | ($d+)$e | ($d+) ~";
$a=explode("|",implode("~|~",explode("|",$a)));
$b=explode("|",$c |,|$e$c $e |$c|\\010|$c,00|$c,00");
$t=preg_replace($a,$b,$t);
echo 
$t."\n"
Починен баг с записями вида 423,323,324 и 423,323,324,2 - теперь они будут восприниматься как 2 числа через запятую, т.е. 423,32,324,00 и 423,32,324,20 соответственно.

Для того и другого (но без починки бага, надо будет, сами соберёте вместе, в предыдущем коде добавлена одна дополнительная регулярка.)

PHP код:
$t="fds2, 2,1kg23.1lkj33wqr423,3233242lnln , w;rjn342relkfndsf";
echo 
$t."\n";
$c="\\1";$d="[0-9]";$e=",\\.";
$a="~([0-9$e]+)| ([$e]) | ($d+[$e]$d{2,2})($d+) | ($d+[$e]$d{1,1}) | ($d+)[$e] | ($d+) ~";
$a=explode("|",implode("~|~",explode("|",$a)));
$b=explode("|",$c |,|$c|\\010|$c,00|$c,00");
$t=preg_replace($a,$b,$t);
echo 
$t."\n"
PS: Тут есть несколько проблем - не всегда точка будет заменена на точку - иногда на запятую и т.п. Может, это и можно довести до ума, но это бессмысленная трата времени и сил. Так что я бы не советовал этим пользоваться - путаница ни к чему ещё хорошему не приводила, и текст просто не ДОЛЖЕН использовать и то и другое одновременно. За такой текст впору отрывать руки, только что бы исключить возможность сделать такое снова. Exempli gratia в привычной мне конотации запятая используется как разделитель каждого третьего разряда: 10,234 - это десять тысяч двести тридцать четыре, а не десять и двести тридцать четыре тысячных.

PPS: Буду рад за репутацию

Последний раз редактировалось graymaster; 13.06.2011 в 13:06.
graymaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как перевести число в строковый формат. в PHP Ast Помощь студентам 8 12.06.2011 08:52
как привести число в строку. PHP Ast Помощь студентам 0 13.01.2011 06:03
Как найти количество n-ого символа в строке? zver777 Общие вопросы Delphi 7 25.08.2009 20:25
Как найти большее число из имеющихся значений в Паскале? Auditor Помощь студентам 7 05.05.2008 21:57