Люди, подскажите ;-)
// Все это относительно PHP-скрипта
Есть строка, в ней может быть произвольное количество чисел, которые больше или равны 10 000. И их надо разбить на разряды (поставить пробелы). Как это сделать? :-)

Разбивка числа на разряды
Started By
Денис
, Oct 14 2007 9:48 AM
13 replies to this topic
#1
Posted 14 October 2007 - 9:48 AM
#2
Posted 14 October 2007 - 18:23 PM
Денис, конкретнее: есть строка "аааааа", из нее требуется получить стороку "вввввввв". А то так не понятно, о чем речь.
С нами сила Алхазашвили!
#3
Posted 14 October 2007 - 18:38 PM
А я в кажется понял, но не пойму, в чём проблема. Вроде бы задача решается влоб. Берётся эта строка и из неё генерится другая, какая надо. Или есть какие-то ограничения?
Я всё отдам за продолжение пути.
#4
Posted 14 October 2007 - 18:46 PM
Есть строка "что-то где-то nnnnn раз, и стоило оно nnnnnnnnn рублей", n — цифра. Надо получить строку "что-то где-то nn nnn раз, и стоило оно nnn nnn nnn рублей". Я не могу сообразить, как извлечь число, которое имеет больше 4 цифр. Ну или (что, наверное, правильнее здесь) 5 или более цифр подряд. От 0 до 9, соответственно. (ну и, по идее, чтобы первая не была нулем, но это уже мелочи).
#5
Posted 14 October 2007 - 18:48 PM
а как извлечь число, имеющее 5 и менее цифр?
Я всё отдам за продолжение пути.
#6
Posted 14 October 2007 - 18:53 PM
ну здесь количество цифр, думаю, роли не играет (разве что не одна). Просто я не очень хорошо знаю PHP; но после изучения функций, работающих со строками я таки не понимаю, как найти последовательность символов, когда комбинация их ограничена только набором символов.
#7
Posted 14 October 2007 - 19:11 PM
Для поиска -- Регулярные выражения тебе в помощь! см. функцию preg(). Но здесь это даже не нужно.
Я бы делал так: идешь по строке, посимвольно копируя ее в другую строку. Нашел цифру -- цикл { пока символ -- цифра пихаем ее в очередь, заодно считаем, сколько цифр в очередь запихали }. Следующий символ не цифра -- потрошим очередь: берем остаток от деления количества цифр в очереди на три. Вытаскиваем столько цифр в результирующую строку, добавляем пробел. Дальше { по три цифры достаем, лепим пробел, } пока не очистим очередь. И продолжаем посимвольно перегонять исходную строку в новую до следующей цифры.
Как-то так. Проход по строке один. Сильно тормозить не будет. Вроде все просто?

С нами сила Алхазашвили!
#8
Posted 14 October 2007 - 19:14 PM
Смотри в сторону регулярных выражений. Это функции pregmatch или eregmatch. Там можно как раз задать, чтобы он выдавал тебе куски из строки, которые состоят только из цифр (с возможной одной запятой в качестве знака разделителя) и имеют длинну больше четырех.
Есть даже pregreplace кажется.
Зато, обладая единственной в мире подводной орбитальной группировкой спутников глонасс...

#9
Posted 14 October 2007 - 19:21 PM
Ага, понятно :-) Да, теперь все кажется таким простым ;-) Спасибо большое!Как-то так. Проход по строке один. Сильно тормозить не будет. Вроде все просто?
Понятно, спасибо ;-)Смотри в сторону регулярных выражений.
Попробую оба варианта, ради обучения полезно :-) Спасибо еще раз всем, кто ответил ;-)
#10
Posted 14 October 2007 - 19:56 PM
Кстати, вариант, предложенный володей может быть и быстрей. Регулярные выражения - довольно нагрузочная штука. На этой задаче может не окупиться. Хотя в любом случае это будет очень быстро. Разница появится только при обработках очень больших массивов данных.
Зато, обладая единственной в мире подводной орбитальной группировкой спутников глонасс...

#11
Posted 14 October 2007 - 20:25 PM
ага :-)
но попробую я, все равно, и так, и так :-)
#12
Posted 15 October 2007 - 21:44 PM
че-то вспоминается вроде... :-D
preg_replace_callback тебе в помощь.
в callback-функцию помещаешь вызов number_format.
и все.
Come what may
#13
Posted 16 October 2007 - 18:34 PM
ага, понял :-) Спасибо!preg_replace_callback тебе в помощь.
в callback-функцию помещаешь вызов number_format.
и все.
#14
Posted 17 October 2007 - 12:30 PM
Все получилось, спасибо всем еще раз ;-)
Остановился таки на способе Володи с перебором строки.
2 user(s) are reading this topic
0 members, 2 guests, 0 anonymous users