За последние 24 часа нас посетили 19328 программистов и 1615 роботов. Сейчас ищут 944 программиста ...

PHP - сумму разного вида перевести в копейки

Тема в разделе "PHP для новичков", создана пользователем AndreyIvanov, 22 мар 2013.

  1. AndreyIvanov

    AndreyIvanov Активный пользователь

    С нами с:
    22 мар 2013
    Сообщения:
    18
    Симпатии:
    0
    Всем привет.
    Я совсем мало понимаю в php.
    У меня такой вопрос.

    есть несколько разных сумм(ужасно конечно, но так мне сделал программист)
    10.500,38
    10,500.38
    10,500
    10 500
    10500

    нужно каждый такой вариант привести в сумму в копейках.
    Т.е. на выходе нужно получить 1050038 или если копеек нет, то 1050000
    Не обязательно, что сумма будет именно такой. Может быть и 1,500 (полторы тысячи), либо 500.00(500 рублей)
    Главное, чтобы она была с копейками и без разделителей.

    Как-то такое можно сделать?

    Буду благодарен за помощь.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а откуда они такие берутся? может проще там поменять?
     
  3. AndreyIvanov

    AndreyIvanov Активный пользователь

    С нами с:
    22 мар 2013
    Сообщения:
    18
    Симпатии:
    0
    Это несколько сайтов, у которых разный формат цен установлен в настройках. Менять его не вариант.

    Но есть вариант получать для каждого настройки цен.
    Т.е. в настройке можно то выставлять сколько символов после запятой, как разделять тысячи и как разделять копейки.
    Но как это прикинуть все в кучу при получении цены и обработать.

    Например я получаю цену 10 500,38
    Разделитель тысяч - пробел
    Чем разделять копейки - ,
    Знаков после запятой - 2 (копейки как раз)

    При этом нужно 100% все это в итоге получать в копейках.

    Может я просто очевидного решения не замечаю(
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну и прекрасно

    менять при получении. покажите код, который эти цены получает.
     
  5. AndreyIvanov

    AndreyIvanov Активный пользователь

    С нами с:
    22 мар 2013
    Сообщения:
    18
    Симпатии:
    0
    Кода там очень много. Один общий файл. Выдрать кусок какой-то определенный не выйдет. Потому как одно связано с другим, другое с третьим...

    Настройки получаю так по определенному сайту
    Код (Text):
    1. $setting['shop_1']['currency']['option_1'] // Разделение тысяч
    2. $setting['shop_1']['currency']['option_2'] // Разделение копеек
    3. $setting['shop_1']['currency']['option_3'] // Знаков после точки(отделяет копейки)
    4. $setting['shop_1']['currency']['option_4'] // Название валюты
    5. $setting['shop_1']['currency']['option_5'] // Символ валюты
    В цикле
    Код (Text):
    1. // цена, которая как раз может быть любым из вариантом указанном в первом топике
    2. $products_info_array['current_price']
    3. // ID магазина.
    4. $products_info_array['shop']
    Мне кажется, что нужно копать в сторону number_format.
    Но пока попытки успехом не увенчались.
     
  6. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Первое что пришло в голову это регулярки, но для этого надо знать возможные варианты которые придумал ваш программист...

    написал такое

    Код (PHP):
    1. <?php
    2. $parsed_prices = array();
    3. $prices = array('10.500,38', '10,500.38', '10,500', '10 500', '10500', '1,500 (полторы тысячи)', '500.00(500 рублей)');
    4. $pattern = '/\(.*\)|[^\d]/';
    5. $replacement = '';
    6.  
    7. for($i=0;$i<count($prices);$i++)
    8.     $parsed_prices[] = number_format(preg_replace($pattern, $replacement, $prices[$i]),2,'','');
    9. var_dump($parsed_prices);
    10. ?>
    Проверьте вроде то что вам надо... хотя нет вам нужно поменять программиста :)

    Добавлено спустя 3 минуты 6 секунд:
    хотя мой вариант не совсем корректен
    38 это же копейки... мда бурная фантазия у вашего программиста:)
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нужно найти знак точку или запятую в двух символах от конца, а если нету - то это целое число. =)
    найдя отрезать, из оставшегося удалить пробелы, точки, запятые и умножить полученное число на сто, прибавить копейки. =)

    я хз как это сделать регулярками.
     
  8. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    а нули обязательно добавлять? Зачем это вам?
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    дык в копейках же.
     
  10. AndreyIvanov

    AndreyIvanov Активный пользователь

    С нами с:
    22 мар 2013
    Сообщения:
    18
    Симпатии:
    0
    В том то и дело, что уже убежал разработчик тот.

    smitt, спасибо, но получается, что нули в конце все время. А 38 это да, копейки. Т.е. к суммам где нет копеек их нужно добавить, а там где есть оставить. Т.е. итоговая сумма должна быть именно копейками.

    igordata, спасибо за наводку. Сейчас попробую что-то сделать как вы описали.

    Добавлено спустя 2 минуты 3 секунды:
    smitt, нули нужны. Например, есть некоторые плат системы, где при оплате сумма нужна именно копейками, так как далее она сама(плат. система) обработает эту сумму. Т.е. если не ставить нули, то сумма 1000 превращается потом в 100.00 после обработки.
     
  11. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Сори не вчитался...

    Без паники я и не такое решал :)

    Вот скорректированный вариант

    Код (PHP):
    1. $parsed_prices = array();
    2. $prices = array('10.500,38', '10,500.38', '10,500', '10 500', '10500', '1,500 (полторы тысячи)', '500.00(500 рублей)');
    3. $pattern = '/\(.*\)|[^\d]/';
    4. $replacement = '';
    5.  
    6. for($i=0;$i<count($prices);$i++){
    7.     $delimetr = substr($prices[$i],-3,1);
    8.     if($delimetr == ',' || $delimetr == '.' || $delimetr == ' ')
    9.         $parsed_prices[] = preg_replace($pattern, $replacement, $prices[$i]);
    10.     else
    11.         $parsed_prices[] = preg_replace($pattern, $replacement, $prices[$i]).'00';
    12. }
    13. var_dump($parsed_prices);
    Вроде учел как вам надо проверяйте

    Добавлено спустя 4 минуты 43 секунды:
    Хотя последний нет сейчас поправляю...
     
  12. AndreyIvanov

    AndreyIvanov Активный пользователь

    С нами с:
    22 мар 2013
    Сообщения:
    18
    Симпатии:
    0
    Огромное спасибо!
    Вроде корректно работает и правильно все обрабатывает.
     
  13. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    нет ошибаетесь :) последний вариант с ошибкой

    вот рабочий вариант

    Код (PHP):
    1. <?php
    2. $parsed_prices = array();
    3. $prices = array('10.500,38', '10,500.38', '10,500', '10 500', '10500', '1,500 (полторы тысячи)', '500.00(500 рублей)');
    4.  
    5. for($i=0;$i<count($prices);$i++){
    6.     $prices[$i] = preg_replace('/\(.*\)/', '', $prices[$i]);        
    7.     $delimetr = substr($prices[$i],-3,1);
    8.     $price = preg_replace('/[^\d]/', '', $prices[$i]);    
    9.     $parsed_prices[] = ($delimetr == ',' || $delimetr == '.') ? $price : $price.'00';
    10. }
    11. var_dump($parsed_prices);
    12. ?>
    Теперь вроде правильно, привет вашему программисту :)
     
  14. AndreyIvanov

    AndreyIvanov Активный пользователь

    С нами с:
    22 мар 2013
    Сообщения:
    18
    Симпатии:
    0
    Спасибо еще раз!
    А что в предыдущем варианте не так было? мне для себя интересно. Потому как вроде корректно все обрабатывало
     
  15. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Я криво обрабатывал '500.00(500 рублей)'

    В начале искал копейки потом удалял скобки а надо наоборот.
    Сейчас вроде правильно, хотя вечер я спать хочу:)
     
  16. AndreyIvanov

    AndreyIvanov Активный пользователь

    С нами с:
    22 мар 2013
    Сообщения:
    18
    Симпатии:
    0
    А. Понял. Спасибо большое за участие и помощь!
     
  17. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    и последний штрих - сижу тестирую...

    Код (PHP):
    1. <?php
    2. $parsed_prices = array();
    3. $prices = array('10.500,38', '10,500.38', '10,500', '10 500', '10500', '1,500 (полторы тысячи)', '500.00(500 рублей)');
    4.  
    5. for($i=0;$i<count($prices);$i++){
    6.     $prices[$i] = preg_replace('/\(.*\)| \(.*\)/', '', $prices[$i]);
    7.     $delimetr = substr($prices[$i],-3,1);
    8.     $price = preg_replace('/[^\d]/', '', $prices[$i]);    
    9.     $parsed_prices[] = ($delimetr == ',' || $delimetr == '.') ? $price : $price.'00';
    10. }
    11. var_dump($parsed_prices);
    12. ?>
    Заменил на эту регулярку
    $prices[$i] = preg_replace('/\(.*\)| \(.*\)/', '', $prices[$i]);