Всем привет. Я совсем мало понимаю в php. У меня такой вопрос. есть несколько разных сумм(ужасно конечно, но так мне сделал программист) 10.500,38 10,500.38 10,500 10 500 10500 нужно каждый такой вариант привести в сумму в копейках. Т.е. на выходе нужно получить 1050038 или если копеек нет, то 1050000 Не обязательно, что сумма будет именно такой. Может быть и 1,500 (полторы тысячи), либо 500.00(500 рублей) Главное, чтобы она была с копейками и без разделителей. Как-то такое можно сделать? Буду благодарен за помощь.
Это несколько сайтов, у которых разный формат цен установлен в настройках. Менять его не вариант. Но есть вариант получать для каждого настройки цен. Т.е. в настройке можно то выставлять сколько символов после запятой, как разделять тысячи и как разделять копейки. Но как это прикинуть все в кучу при получении цены и обработать. Например я получаю цену 10 500,38 Разделитель тысяч - пробел Чем разделять копейки - , Знаков после запятой - 2 (копейки как раз) При этом нужно 100% все это в итоге получать в копейках. Может я просто очевидного решения не замечаю(
Кода там очень много. Один общий файл. Выдрать кусок какой-то определенный не выйдет. Потому как одно связано с другим, другое с третьим... Настройки получаю так по определенному сайту Код (Text): $setting['shop_1']['currency']['option_1'] // Разделение тысяч $setting['shop_1']['currency']['option_2'] // Разделение копеек $setting['shop_1']['currency']['option_3'] // Знаков после точки(отделяет копейки) $setting['shop_1']['currency']['option_4'] // Название валюты $setting['shop_1']['currency']['option_5'] // Символ валюты В цикле Код (Text): // цена, которая как раз может быть любым из вариантом указанном в первом топике $products_info_array['current_price'] // ID магазина. $products_info_array['shop'] Мне кажется, что нужно копать в сторону number_format. Но пока попытки успехом не увенчались.
Первое что пришло в голову это регулярки, но для этого надо знать возможные варианты которые придумал ваш программист... написал такое Код (PHP): <?php $parsed_prices = array(); $prices = array('10.500,38', '10,500.38', '10,500', '10 500', '10500', '1,500 (полторы тысячи)', '500.00(500 рублей)'); $pattern = '/\(.*\)|[^\d]/'; $replacement = ''; for($i=0;$i<count($prices);$i++) $parsed_prices[] = number_format(preg_replace($pattern, $replacement, $prices[$i]),2,'',''); var_dump($parsed_prices); ?> Проверьте вроде то что вам надо... хотя нет вам нужно поменять программиста Добавлено спустя 3 минуты 6 секунд: хотя мой вариант не совсем корректен 38 это же копейки... мда бурная фантазия у вашего программиста
нужно найти знак точку или запятую в двух символах от конца, а если нету - то это целое число. =) найдя отрезать, из оставшегося удалить пробелы, точки, запятые и умножить полученное число на сто, прибавить копейки. =) я хз как это сделать регулярками.
В том то и дело, что уже убежал разработчик тот. smitt, спасибо, но получается, что нули в конце все время. А 38 это да, копейки. Т.е. к суммам где нет копеек их нужно добавить, а там где есть оставить. Т.е. итоговая сумма должна быть именно копейками. igordata, спасибо за наводку. Сейчас попробую что-то сделать как вы описали. Добавлено спустя 2 минуты 3 секунды: smitt, нули нужны. Например, есть некоторые плат системы, где при оплате сумма нужна именно копейками, так как далее она сама(плат. система) обработает эту сумму. Т.е. если не ставить нули, то сумма 1000 превращается потом в 100.00 после обработки.
Сори не вчитался... Без паники я и не такое решал Вот скорректированный вариант Код (PHP): $parsed_prices = array(); $prices = array('10.500,38', '10,500.38', '10,500', '10 500', '10500', '1,500 (полторы тысячи)', '500.00(500 рублей)'); $pattern = '/\(.*\)|[^\d]/'; $replacement = ''; for($i=0;$i<count($prices);$i++){ $delimetr = substr($prices[$i],-3,1); if($delimetr == ',' || $delimetr == '.' || $delimetr == ' ') $parsed_prices[] = preg_replace($pattern, $replacement, $prices[$i]); else $parsed_prices[] = preg_replace($pattern, $replacement, $prices[$i]).'00'; } var_dump($parsed_prices); Вроде учел как вам надо проверяйте Добавлено спустя 4 минуты 43 секунды: Хотя последний нет сейчас поправляю...
нет ошибаетесь последний вариант с ошибкой вот рабочий вариант Код (PHP): <?php $parsed_prices = array(); $prices = array('10.500,38', '10,500.38', '10,500', '10 500', '10500', '1,500 (полторы тысячи)', '500.00(500 рублей)'); for($i=0;$i<count($prices);$i++){ $prices[$i] = preg_replace('/\(.*\)/', '', $prices[$i]); $delimetr = substr($prices[$i],-3,1); $price = preg_replace('/[^\d]/', '', $prices[$i]); $parsed_prices[] = ($delimetr == ',' || $delimetr == '.') ? $price : $price.'00'; } var_dump($parsed_prices); ?> Теперь вроде правильно, привет вашему программисту
Спасибо еще раз! А что в предыдущем варианте не так было? мне для себя интересно. Потому как вроде корректно все обрабатывало
Я криво обрабатывал '500.00(500 рублей)' В начале искал копейки потом удалял скобки а надо наоборот. Сейчас вроде правильно, хотя вечер я спать хочу
и последний штрих - сижу тестирую... Код (PHP): <?php $parsed_prices = array(); $prices = array('10.500,38', '10,500.38', '10,500', '10 500', '10500', '1,500 (полторы тысячи)', '500.00(500 рублей)'); for($i=0;$i<count($prices);$i++){ $prices[$i] = preg_replace('/\(.*\)| \(.*\)/', '', $prices[$i]); $delimetr = substr($prices[$i],-3,1); $price = preg_replace('/[^\d]/', '', $prices[$i]); $parsed_prices[] = ($delimetr == ',' || $delimetr == '.') ? $price : $price.'00'; } var_dump($parsed_prices); ?> Заменил на эту регулярку $prices[$i] = preg_replace('/\(.*\)| \(.*\)/', '', $prices[$i]);