3 декабря 2010 1 комментарий

Источник: http://habrahabr.ru/blogs/php/53210/

/**
 * Сумма прописью
 * @author runcore
 */
function num2str($inn, $stripkop=false) {
    $nol = 'ноль';
    $str[100]= array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот', 'восемьсот','девятьсот');
    $str[11] = array('','десять','одиннадцать','двенадцать','тринадцать', 'четырнадцать','пятнадцать','шестнадцать','семнадцать', 'восемнадцать','девятнадцать','двадцать');
    $str[10] = array('','десять','двадцать','тридцать','сорок','пятьдесят', 'шестьдесят','семьдесят','восемьдесят','девяносто');
    $sex = array(
        array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),// m
        array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять') // f
    );
    $forms = array(
        array('копейка', 'копейки', 'копеек', 1), // 10^-2
        array('рубль', 'рубля', 'рублей',  0), // 10^ 0
        array('тысяча', 'тысячи', 'тысяч', 1), // 10^ 3
        array('миллион', 'миллиона', 'миллионов',  0), // 10^ 6
        array('миллиард', 'миллиарда', 'миллиардов',  0), // 10^ 9
        array('триллион', 'триллиона', 'триллионов',  0), // 10^12
    );
    $out = $tmp = array();
    // Поехали!
    $tmp = explode('.', str_replace(',','.', $inn));
    $rub = number_format($tmp[ 0], 0,'','-');
    if ($rub== 0) $out[] = $nol;
    // нормализация копеек
    $kop = isset($tmp[1]) ? substr(str_pad($tmp[1], 2, '0', STR_PAD_RIGHT), 0,2) : '00';
    $segments = explode('-', $rub);
    $offset = sizeof($segments);
    if ((int)$rub== 0) { // если 0 рублей
        $o[] = $nol;
        $o[] = morph( 0, $forms[1][ 0],$forms[1][1],$forms[1][2]);
    }
    else {
        foreach ($segments as $k=>$lev) {
            $sexi= (int) $forms[$offset][3]; // определяем род
            $ri = (int) $lev; // текущий сегмент
            if ($ri== 0 && $offset>1) {// если сегмент==0 & не последний уровень(там Units)
                $offset--;
                continue;
            }
            // нормализация
            $ri = str_pad($ri, 3, '0', STR_PAD_LEFT);
            // получаем циферки для анализа
            $r1 = (int)substr($ri, 0,1); //первая цифра
            $r2 = (int)substr($ri,1,1); //вторая
            $r3 = (int)substr($ri,2,1); //третья
            $r22= (int)$r2.$r3; //вторая и третья
            // разгребаем порядки
            if ($ri>99) $o[] = $str[100][$r1]; // Сотни
            if ($r22>20) {// >20
                $o[] = $str[10][$r2];
                $o[] = $sex[ $sexi ][$r3];
            }
            else { // <=20
                if ($r22>9) $o[] = $str[11][$r22-9]; // 10-20
                elseif($r22> 0) $o[] = $sex[ $sexi ][$r3]; // 1-9
            }
            // Рубли
            $o[] = morph($ri, $forms[$offset][ 0],$forms[$offset][1],$forms[$offset][2]);
            $offset--;
        }
    }
    // Копейки
    if (!$stripkop) {
        $o[] = $kop;
        $o[] = morph($kop,$forms[ 0][ 0],$forms[ 0][1],$forms[ 0][2]);
    }
    return preg_replace("/\s{2,}/",' ',implode(' ',$o));
}
 
/**
 * Склоняем словоформу
 */
function morph($n, $f1, $f2, $f5) {
    $n = abs($n) % 100;
    $n1= $n % 10;
    if ($n>10 && $n<20) return $f5;
    if ($n1>1 && $n1<5) return $f2;
    if ($n1==1) return $f1;
    return $f5;
}

Пример использования:

num2str(878867.15);

выведет:
восемьсот семьдесят восемь тысяч восемьсот шестьдесят семь рублей пятнадцать копеек
Источник: http://habrahabr.ru/blogs/php/53210/

Categories: PHP Tags:
16 ноября 2010 Нет комментариев

Вариант в 1 строку:

echo substr_replace(preg_replace("/[^0-9?]/si","",$products[$j]['price'])-preg_replace("/[^0-9?]/si","",$products[$j]['special']),substr(preg_replace("/[^0-9?]/si","",$products[$j]['price'])-preg_replace("/[^0-9?]/si","",$products[$j]['special']),-4,1).",",-4,1)."&nbsp;р.";
Categories: CMS Tags: ,
9 ноября 2010 1 комментарий

Пример с учетом того, что имеем дату в формате mysql DATETIME
например

$dt="2012-11-08 09:25:37";

Вариант 1 более правильный, когда нам нужно отделить дату в формате XXXX-XX-XX (год-месяц-день):

$s_dt=substr($dt,0,10);
$num_days=ceil((strtotime($s_dt)-time())/86400);
echo $num_days;

Вариант 2, подошел бы в том случае, если бы мы имели отдельно год, месяц и день, но все же:

$s_year=substr($dt,0,4);
$s_month=substr($dt,5,2);
$s_day=substr($dt,8,2);
$num_days=ceil((mktime(0,0,0,$s_month,$s_day,$s_year)-time())/86400);
echo $num_days;

http://ru.faqstorage.com/faq/question/195/
http://zendframework.ru/forum/index.php?topic=2869.0

Categories: PHP Tags:
3 ноября 2010 Нет комментариев

Получаем value селекта по id:

var select=document.getElementById('selectid');
var selectvalue=select.options[select.selectedIndex].value;
Categories: Javascript Tags:
31 октября 2010 6 комментариев

Функции:

function printBlock() {
	PrintContent = $('#PrintContent').html();
	$('body').addClass('printSelected');
	$('body').append('<div class="printSelection">'+PrintContent+'</div>');
	window.print();
	window.setTimeout(pageCleaner,0);
	return false;
}
function pageCleaner(){
	$('body').removeClass('printSelected');
	$('.printSelection').remove();
}

Если бы ссылка на печать была внутри блока то:

function printBlock(printLink) {
PrintContent = $(printLink).parents('#PrintContent').html();
...

Ссылка:

<a href="" onclick="printBlock();">Распечатать</a>

Стили:

.printSelected div{display:none}
.printSelected div.printSelection{display:block;}
.printSelected div.printSelection div{display:block;}

По статье:http://htmltricks.ru/archives/77

Categories: Javascript Tags:
30 октября 2010 Нет комментариев

В шаблоне перед foreach где рисуем новости.
Рисуем форму (даты необходимо будет указывать в формате день-месяц-год (xx-xx-xxxx), разделительный знак любой, нам важен порядковый номер цифр), для удобства можно использовать что-то вроде datePicker, но это уже совсем другая история)):

<form method="get" id="set_period">
	<label for="date1">С</label>
		&nbsp;
	<input type="text" name="date1" id="date1" value="<?=$_GET['date1']?>" />
		&nbsp;&ndash;&nbsp;
	<label for="date2">ПО</label>
		&nbsp;
	<input type="text" name="date2" id="date2" value="<?=$_GET['date2']?>" />
		&nbsp;
	<a href="#" onclick="$('#set_period').submit();">Показать</a>
</form>

Формируем массив дат, в нужном нам формате, который позволяет сделать выборку по принципу «больше или равно — меньше или равно», т.е. в формате (год, месяц, день) без разделительных знаков.

<?$news_dates=array();
function ParceResultDates($date) {
	$df_day=substr($date,0,2);
	$df_mon=substr($date,3,2);
	$df_ye=substr($date,6,4);
	$d_format=$df_ye.$df_mon.$df_day;
	return $d_format;
}
foreach($arResult["ITEMS"]as$arDates):
	$news_dates[]=ParceResultDates($arDates['DISPLAY_ACTIVE_FROM']);
endforeach;?>

Далее в foreach где выводим новости:

<?
//if(($_GET['date1']!='')&&($_GET['date2']!='')):
	//$date_from=ParceResultDates($_GET['date1']);
	//$date_to=ParceResultDates($_GET['date2']);
//else:
	//$date_from=ParceResultDates($arItem['DISPLAY_ACTIVE_FROM']);
	//$date_to=ParceResultDates($arItem['DISPLAY_ACTIVE_FROM']);
//endif;
$date_from=($_GET['date1']!='')?ParceResultDates($_GET['date1']):ParceResultDates($arItem['DISPLAY_ACTIVE_FROM']);
$date_to=($_GET['date2']!='')?ParceResultDates($_GET['date2']):ParceResultDates($arItem['DISPLAY_ACTIVE_FROM']);
$current_active_from=ParceResultDates($arItem['DISPLAY_ACTIVE_FROM']);
if (($current_active_from>=$date_from)&&($current_active_from<=$date_to)):
?>
	<!--Тут новости-->
<?endif;?>

Закоментрованная область — это если было бы необходимо указать только обе даты, иначе выводим все новости. Ниже 2 строки для того чтобы можно было указывать только начальную и/или конечную даты

Categories: CMS Tags:
30 октября 2010 Нет комментариев
$str=strrev($str);

а я уже хотел придумывать как перевернуть)

Categories: PHP Tags: