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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2011, 13:36   #1
brulik67
Пользователь
 
Регистрация: 12.06.2011
Сообщений: 12
По умолчанию Функция генерации цены товара

Нужно написать функцию генерации цены товара в строковом формате. Вывести результат в окно браузера. Допустим, на входе функции получена цена 38243.75, вы должны вывести «тридцать восемь тысяч двести сорок три рубля семьдесят пять копеек».

получился вот такой код, только есть недоделки, помогите доделать

1 Нужна функция которая бы из переменной $numder вытаскивала значения до точки и записывала их в одну переменную а после точки в другую. Код ниже написан для числовых значений без точек, так же надпись "Рублей" не выводится, если вбить число оканчивающееся на "0"

2 не могу понять как сделать чтоб выводились числа 10 11 12 и тд.до 19 куда их отнести.

3 если уведите еще какие нибудь баги, буду рад помощи при их устранении

PHP код:
$number 45330;
$str strval($number);            //преобразуем переменную в строковое значение
$dest '';

for (
$i=strlen($str);$i>0;$i--)        //Вытаскиваем длину строки 
{
 if  (
$i==5)
 {
  switch ( 
substr($str,strlen($str)-$i,1) ) 
 {
  
  case 
2$dest =$dest.' Двадцать ';break;
  case 
3$dest =$dest.' Тридцать ';break;
  case 
4$dest =$dest.' Сорок ';break;
  case 
5$dest =$dest.' Пятьдесят ';break;
  case 
6$dest =$dest.' Шестьдесят ';break;
  case 
7$dest =$dest.' Семьдесят ';break;
  case 
8$dest =$dest.' Восемьдесят ';break;
  case 
9$dest =$dest.' Девяносто ';break;
 }
 }
 if  (
$i==4)
 {
  switch ( 
substr($str,strlen($str)-$i,1) ) 
 {
  case 
1$dest =$dest.' Одна Тысяча ';break;
  case 
2$dest =$dest.' Две Тысячи ';break;
  case 
3$dest =$dest.' Три Тысячи ';break;
  case 
4$dest =$dest.' Четыре Тысячи ';break;
  case 
5$dest =$dest.' Пять Тысяч ';break;
  case 
6$dest =$dest.' Шесть Тысяч ';break;
  case 
7$dest =$dest.' Семь Тысяч ';break;
  case 
8$dest =$dest.' Восемь Тысяч ';break;
  case 
9$dest =$dest.' Девять Тысяч ';break;
 }
 }
 if  (
$i==3)
 {
  switch ( 
substr($str,strlen($str)-$i,1) ) 
 {
  case 
1$dest =$dest.' Сто';break;
  case 
2$dest =$dest.' Двести';break;
  case 
3$dest =$dest.' Тристо';break;
  case 
4$dest =$dest.' Четыресто';break;
  case 
5$dest =$dest.' Пятьсот';break;
  case 
6$dest =$dest.' Шестьсот';break;
  case 
7$dest =$dest.' Семьсот';break;
  case 
8$dest =$dest.' Восемьсот';break;
  case 
9$dest =$dest.' Девятьсот';break;
 }
 }
 if  (
$i==2)
 {
  switch (
substr($str,strlen($str)-$i,1))
 {
  case 
2$dest =$dest.' Двадцать'; break;
  case 
3$dest =$dest.' Тридцать'; break;
  case 
4$dest =$dest.' Сорок'; break;
  case 
5$dest =$dest.' Пятьдесят'; break;
  case 
6$dest =$dest.' Шестьдесят'; break;
  case 
7$dest =$dest.' Семьдесят'; break;
  case 
8$dest =$dest.' Восемьдесят'; break;
  case 
9$dest =$dest.' Девяносто'; break;
  
   
 }
 }
 if  (
$i==1)
 {
  switch (
substr($str,strlen($str)-$i,1))
  { 
  case 
1$dest =$dest.' Один Рубль '; break;
  case 
2$dest =$dest.' Два Рубля '; break;
  case 
3$dest =$dest.' Три Рубля '; break;
  case 
4$dest =$dest.' Четыре Рубля '; break;
  case 
5$dest =$dest.' Пять Рублей '; break;
  case 
6$dest =$dest.' Шесть Рублей '; break;
  case 
7$dest =$dest.' Семь Рублей '; break;
  case 
8$dest =$dest.' Восемь Рублей '; break;
  case 
9$dest =$dest.' Девять Рублей '; break;
  }
 }
}
echo 
$dest
brulik67 вне форума Ответить с цитированием
Старый 14.06.2011, 13:57   #2
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
Код ниже написан для числовых значений без точек, так же надпись "Рублей" не выводится, если вбить число оканчивающееся на "0"
Потому-что нет кейса для 0.
Цитата:
2 не могу понять как сделать чтоб выводились числа 10 11 12 и тд.до 19 куда их отнести.
Никуда, ваш код такого не предусматривает.
Цитата:
3 если уведите еще какие нибудь баги, буду рад помощи при их устранении
Весь ваш код написан в идусском стиле и требует переработки. Используйте массивы, циклы и тп
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 14.06.2011, 14:23   #3
brulik67
Пользователь
 
Регистрация: 12.06.2011
Сообщений: 12
По умолчанию

вы имеете в виду слова в массив запихать и потом перебирать их циклами?
brulik67 вне форума Ответить с цитированием
Старый 14.06.2011, 14:36   #4
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,624
По умолчанию

Цитата:
вы имеете в виду слова в массив запихать и потом перебирать их циклами?
Для начала.
Читаем число "с конца", определяем нет ли попадания в диапозон 11-19 или 0, чтобы исключитьб один шаг если да, далее влево по 1 цифре.
Стрелок-охотник
mv28jam вне форума Ответить с цитированием
Старый 14.06.2011, 16:13   #5
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Действительно, переделать проще, чем написать, да. Но, унеся ваши чемоданы в функцию, можно получить что-то более прозрачное и универсальное.

Вот как-то так:
PHP код:
<?
$number 
45330.50
$str strval($number);            //преобразуем переменную в строковое значение 

$t=explode(".",$number); // Отделяем дробную часть
// Делим на классы (получаем 45 и 330)
$m=array_reverse(str_split(str_repeat("0",(3-strlen($t[0])%3)%3).$t[0],3));
$desc='';
// Строчим каждый класс отдельно (не прошиваем, а превращем в строку:))
if (isset($m[2])) $desc.= stringalizeThreeDigits($m[2],true,array(1=>"миллион",2=>"миллиона",5=>"миллионов"));
if (isset(
$m[1])) $desc.=($desc?" ":"").stringalizeThreeDigits($m[1],false,array(1=>"тысяча",2=>"тысячи",5=>"тысяч"));
// Обратите внимание, что задан нулевой элемент, что бы получить "ноль рублей" в случае крайней необходимости.
$desc.=($desc?" ":"").stringalizeThreeDigits($m[0],true,array(0=>"рублей",1=>"рубль",2=>"рубля",5=>"рублей"));

if (isset(
$t[1])) $desc.=" и ".stringalizeThreeDigits(substr($t[1].'00',0,2),false,array(0=>"копеек",1=>"копейка",2=>"копейки",5=>"копеек"));
echo 
$desc;





function 
stringalizeThreeDigits ($num,$male,$class_addition) {
    
$str substr('000'.strval($num),-3);
    if (
$str=='000') {
        return isset(
$class_addition[0])?"ноль ".$class_addition[0]:"";
    }
    if (
$str[1]=='1') {
        switch (
$str[2]) {
            case 
'0'$ans_strs="десять ".$class_addition[5];break;
            case 
'1'$ans_strs="одиннадцать".$class_addition[5];break;
            case 
'2'$ans_strs="двенадцать".$class_addition[5];break;
            case 
'3'$ans_strs="тринадцать".$class_addition[5];break;
            case 
'4'$ans_strs="четырнадцать".$class_addition[5];break;
            case 
'5'$ans_strs="пятнадцать".$class_addition[5];break;
            case 
'6'$ans_strs="шестнадцать".$class_addition[5];break;
            case 
'7'$ans_strs="семнадцать".$class_addition[5];break;
            case 
'8'$ans_strs="восемнадцать".$class_addition[5];break;
            case 
'9'$ans_strs="девятнадцать".$class_addition[5];break;
        }
    } else {
        switch (
$str[2]) {
            case 
'0'$ans_strs=$class_addition[5];break;
            case 
'1'$ans_strs=($male?"один":"одна")." ".$class_addition[1];break;
            case 
'2'$ans_strs=($male?"два":"две")." ".$class_addition[2];break;
            case 
'3'$ans_strs="три ".$class_addition[2];break;
            case 
'4'$ans_strs="четыре ".$class_addition[2];break;
            case 
'5'$ans_strs="пять ".$class_addition[5];break;
            case 
'6'$ans_strs="шесть ".$class_addition[5];break;
            case 
'7'$ans_strs="семь ".$class_addition[5];break;
            case 
'8'$ans_strs="восемь ".$class_addition[5];break;
            case 
'9'$ans_strs="девять ".$class_addition[5];break;
        }
    }
    switch (
$str[1]) {
            case 
'0': break;
            case 
'1': break;
            case 
'2'$ans_strs="двадцать ".$ans_strs;break;
            case 
'3'$ans_strs="тридцать ".$ans_strs;break;
            case 
'4'$ans_strs="сорок ".$ans_strs;break;
            case 
'5'$ans_strs="пятьдесят ".$ans_strs;break;
            case 
'6'$ans_strs="шестьдесят ".$ans_strs;break;
            case 
'7'$ans_strs="семьдесят ".$ans_strs;break;
            case 
'8'$ans_strs="восемьдесят ".$ans_strs;break;
            case 
'9'$ans_strs="девяносто ".$ans_strs;break;
    }
    switch (
$str[0]) {
            case 
'0': break;
            case 
'1'$ans_strs="сто ".$ans_strs;break;
            case 
'2'$ans_strs="двести ".$ans_strs;break;
            case 
'3'$ans_strs="триста ".$ans_strs;break;
            case 
'4'$ans_strs="четыреста ".$ans_strs;break;
            case 
'5'$ans_strs="пятьсот ".$ans_strs;break;
            case 
'6'$ans_strs="шестьсот ".$ans_strs;break;
            case 
'7'$ans_strs="семьсот ".$ans_strs;break;
            case 
'8'$ans_strs="восемьсот ".$ans_strs;break;
            case 
'9'$ans_strs="девятьсот ".$ans_strs;break;
    }
    return 
$ans_strs;
}
?>
Результат:
Цитата:
сорок пять тысяч триста тридцать рублей и пятьдесят копеек
Правописание, если где есть ошибки, пофиксите сами.
Скрипт так же тестил без фанатизма, так что возможны баги, проверьте на разных значениях.

Функция довольно универсальна, понятно как пользоваться ?

аргументы:
$num - число, можно как строковое, так и численное значение
$male - труъ, если мужской род, женский - фолз (да не обидятся прекрасные дамы, я не имел в виду ничего плохого).
А вот про существование в русском языке среднего рода я как-то так забыл
Ничего, сами допишите, если припрёт.

$class_addition - массив текстовых дополнений класса чисел.
эл.1 - для один,
эл.2 - для два, три, четыре,
эл.5 - для пяти и больше.
эл.0 - если он есть, то при $num==0 выводится "ноль .эл.0" (типа, ноль рублей).
если эл.0 не задан, то при $num==0 возвращается пустая строка.
Впрочем, примеры использования есть в скрипте.

PS: А зачем тут могут понадобиться цыклы ? Выводить в строку числа до 10Е15 или 10Е30 ? там, сколько мне помнится, названия все в мужском роде, можно и зациклить. Только вот если цены на товары реально дойдут до такого ренджа, это будет как-то так грустновато.
/* хех, 90% население - миллиардеры, еще 10% - биллионеры и ещё 10 человек квадрильонеры */

Последний раз редактировалось graymaster; 14.06.2011 в 19:27.
graymaster вне форума Ответить с цитированием
Старый 15.06.2011, 17:16   #6
brulik67
Пользователь
 
Регистрация: 12.06.2011
Сообщений: 12
По умолчанию

да практически все понятно, спасибо Вам !, если не секрет давно программированием занимаетесь?
brulik67 вне форума Ответить с цитированием
Старый 15.06.2011, 17:28   #7
graymaster
Форумчанин
 
Аватар для graymaster
 
Регистрация: 03.05.2011
Сообщений: 158
По умолчанию

Лет 17. Но php в активе последние года 4 только. Много практики с достаточно нестандартными задачами довольно быстро набивают экспу
graymaster вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция генерации случайных чисел rand() в main pufystyj Общие вопросы C/C++ 4 08.02.2011 21:09
функция генерации последовательностей kaljan775 Общие вопросы C/C++ 0 08.12.2010 00:10
Вывод цены AllForCS PHP 3 18.04.2010 09:18
Цены проектов leffet Свободное общение 7 17.02.2010 14:13
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04