Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Подкорректировать цену


Автор: neoks 11.9.2011, 12:32
Вообшем нужно правильно выводить цены, делаю продажу модулей и не знаю как подойти.
Суть в том что продавец может указать любую цену например 0.10345563 или 10.000 или 1.200.0000

Нужно как то корректировать цены, чтоб получилось 

0.10345563 = 0.10
10.000         = 10.000
1.200.0000  = 1200.00
1.235736     = 1.23
1234.56       = 1234.56

В вебмани сказано: Сумма платежа, которую продавец желает получить от покупателя. Сумма должна быть больше нуля, дробная часть отделяется точкой.

То есть если поставить цену 0.104483552 то он мне скажет err: 2 payment amount (0.104483552) is incorrect or not defined by merchant step:8

Нужна ваша помощь, как можно подкорректировать цены чтоб получилось так:

0.10345563 = 0.10
10.000         = 10.000
1.200.0000  = 1200.00
1.235736     = 1.23
1234.56       = 1234.56

Не знаю чем подойти циклом или заменой, может уже есть готовая функция ?

Автор: ksnk 11.9.2011, 12:46
То есть, если в изображении числа две и больше точек - нужно их игнорировать? А что делать, если только одна точка, и та разделитель тысяч, а не разделитель копеек? Или просто декоративный элемент?

Самый разумный, имхо, способ - проверять число по маске. Если число не подходит - говорить "ошибка при вводе цены, возможно, вы имели вот это..." + пытаться его отконвертировать и предложить вариант правки пользователю. Тоесть, при неправильном вводе все равно добавляется один шаг корректировки. В этом случае очень умный вариант корректировки сочинять не нужно.

Автор: neoks 11.9.2011, 13:00
Нашол функцию http://ru.php.net/manual/ru/function.number-format.php

Код

number_format($number, 2, '.', '');


Вроде как подходит но слегка сомневаюсь в ней.

То есть если я укажу 10.000 то она мне вернет 10.00 получается вместо 10тыс я получу 10 баксов.
Или если я укажу 1000000 то она мне вернет 1000000.00 тока не знаю это и вправду один лимон получается если 2 нуля дописано с точкой smile

Как я понял нужно к этой функции что то еше придумать чтоб правильно работало или проше вариант сделать подсказку продавцу как нужно указывать цены.
Логично если ставить точку например 10000 и поставить точку 10.000 получается 10$ но с другой стороны там ведь 3 нуля а значит что это 10тыс.  smile 

Пока не понимая как это реализовать.

Автор: Muerto 11.9.2011, 13:29
Не пользуйся этой функцией, правильная формула того что тебе нужна будет

Код

floor (23.234234 * 10^2)   /  10^2 

Автор: neoks 11.9.2011, 13:39
Muerto
Хм, какай та она странная, вместо 10 дает 8, вместо 10000 дает 10002 вместо 10.000 дает 8  smile 

Автор: Muerto 11.9.2011, 13:51
Ну давай посчитаем

Код

10 * 10^2 = 1000
1000 / 10^2 = 10


Ищите странности у себя  smile 

На крайняк сюда вбить можно http://www.wolframalpha.com/

http://www.wolframalpha.com/input/?i=%28floor+%2823.236234+*+10^2%29+%29++%2F++10^2+


Автор: neoks 11.9.2011, 14:03
Вот сами попробуйте  smile 

Код

$a = 10 * 10^2; //1000
$b = $a / 10^2;//10
print $b;

// результат 8


Я не чего просто так не рассказываю, яж пробою и вот результат   smile 

А вообще пришла мне идея, просто напросто не давать продавцу вбивать больше 1й точки и парсить функцией number_format()
Она отлично работает вот только с 2мя точками плохо понимает.

Думаю так и сделаю, просто не дам вбивать больше 1й точки, как сделаю отпишусь.  smile 

Автор: Muerto 11.9.2011, 14:04
Я вам дал в математической форме, а не в php

в php есть pow http://php.net/manual/en/function.pow.php для степени
Код

pow(10,2)  <=> 10^2

а floor http://php.net/manual/en/function.floor.php не меняется


Автор: neoks 11.9.2011, 14:32
floor - для округления чисел что мне не нужно  smile 
pow - так и не понял что это такое.

Вообшем я сделал банально, запретил вбивать больше 1й точки  smile  и больше 2х нулей после точки.

Получилось так:

10.00
1.00
01.00
1
1000.00
1000

и тд. Потом подкорректирую своей функции и проверю функцией number_format();

Конечно вышло немного геморройно но что делать.

Автор: Muerto 11.9.2011, 14:45
Ну pow(x, y) Это тоже самое как x^y , это самая база школьная - степени, икс в квадрате pow(x,2)  smile 

А контралировать на стороне клиента плохо - он подменить может.

Автор: neoks 11.9.2011, 15:06
Хууу, все сделал.
Кому интересно вот скрипт.
Код

cor_price = function(id){
        var val  = $(id).val().replace(/[^0-9.]/g,'');
            val  = val.substr(0,10,val);
        var regh = '';
        
        var spl = val.split('.');
        
        if(spl.length > 1){
            
            if(spl[0].length > 1 && spl[0].substr(0,1) == '0'){
                val = val.substr(1,(val.length - 1));
            }
            
            if(spl[1].length > 2){
                val = val.substr(0,(val.length - 1));
            }
        }
        
        if(spl.length > 2){
            val = val.substr(0,(val.length - 1));
        }
            
        $(id).val(val);
    }


Код

function cur_prices($number){
    $pc = explode('.',$number);

    if(count($pc) > 1){
        $number = $pc[0].($pc[1] !== '' ? '.' : '').substr($pc[1],0,2);
    }

    return number_format($number, 2, '.', '');
}


Javascript стерает все ненужные значения, пример: 034.1339.098 переводит в 34.13
На случий если кто та отключит javascript или попытается подсунуть другие значения то функция cur_prices() заменит на тоже число что и java вернет 34.13

Пример javascript: функция срабатывает при нажатие клавы
Код

<input type="text" onkeyup="cor_price(this)" />


Автор: Absinthe 11.9.2011, 16:56
Цитата

То есть если я укажу 10.000 то она мне вернет 10.00 получается вместо 10тыс я получу 10 баксов.
 А где тут 10 тыс упомянаются? Это все твои фантазии ))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)