Курс валюты с ЦБР

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
Аватара пользователя
dioxin
Сообщения: 175
Зарегистрирован: Вт фев 14, 2017 4:43 pm
Откуда: Иваново
Благодарил (а): 15 раз
Поблагодарили: 46 раз

Курс валюты с ЦБР

Сообщение dioxin » Вт фев 14, 2017 8:21 pm

Недавно начал использовать MD методом проб и ошибок. Брал различные куски кодов и собирал.
Сделал сбор курса доллара и евро с центробанка.
1.jpg
1.jpg (484.33 КБ) 2972 просмотра
Вот собственно метод:
СпойлерПоказать

Код: Выделить всё

$data=date("d/m/Y");
$file = simplexml_load_file("http://www.cbr.ru/scripts/XML_daily.asp?date_req=".$data);
sg("cbr.uptime", $data); // кидаем сегодняшнюю дату
$xml = $file->xpath("//Valute[@ID='R01235']");
$valute = strval($xml[0]->Value);
$dollar = str_replace(",",".",$valute);
$dollar = substr($dollar,0,-2);
$dollar1 = $dollar;
echo $dollar."  "; // для отладки
$format='mini';
$dollar = priceToRublesAndKopeck($dollar, $format);
sg("cbr.USD", $dollar); //кидаем курс доллара
$format='full';
$dollar1 = priceToRublesAndKopeck($dollar1, $format);
sg("cbr.USD_full", $dollar1); //кидаем курс доллара для алисы
$xml = $file->xpath("//Valute[@ID='R01239']");
$valute = strval($xml[0]->Value);
$euro = str_replace(",",".",$valute);
$euro = substr($euro,0,-2);
$euro1 = $euro;
echo $euro; // для отладки
$format='mini';
$euro = priceToRublesAndKopeck($euro, $format);
sg("cbr.EURO",$euro); //кидаем курс евро
$format='full';
$euro1 = priceToRublesAndKopeck($euro1, $format);
sg("cbr.EURO_full", $euro1); //кидаем курс евро для алисы

// Получаем курс на завтра
$data1 = strtotime("+1 day");
$data1 = date("d/m/Y", $data1);
$file = simplexml_load_file("http://www.cbr.ru/scripts/XML_daily.asp?date_req=".$data1);
sg("cbr.uptime1", $data1); //кидаем завтрашнюю дату
$xml = $file->xpath("//Valute[@ID='R01235']");
$valute = strval($xml[0]->Value);
$dollar = str_replace(",",".",$valute);
$dollar = substr($dollar,0,-2);
echo "<br>".$dollar."  "; // для отладки
$format='mini';
$dollar = priceToRublesAndKopeck($dollar, $format);
sg("cbr.USD1", $dollar); //кидаем курс доллара на завтра
$xml = $file->xpath("//Valute[@ID='R01239']");
$valute = strval($xml[0]->Value);
$euro = str_replace(",",".",$valute);
$euro = substr($euro,0,-2);
echo $euro; // для отладки
$format='mini';
$euro = priceToRublesAndKopeck($euro, $format);
sg("cbr.EURO1",$euro); //кидаем курс евро на завтра

function priceToRublesAndKopeck($price, $format) {

    if ($format == 'mini') {
            $rub_u = " р."; $kop_u = " к.";
        }
    if ($format == 'medium') {
            $rub_u = " руб."; $kop_u = " коп.";
        }
    if ($format == 'full') {
            $rub_u = " рублей"; $kop_u = " копеек";
        }
 
    if ($price != 0) {
 
        $point = strpos($price, '.');
        // Отделяем рубли от копеек
        if ( !empty($point) ) {
            $rub = substr($price, 0, $point);
            $kop = substr($price, $point + 1);
        }
        // Формируем строку
        if ($rub == 0) $result = $kop.$kop_u;
            else $result = $rub.$rub_u." ".$kop.$kop_u;
        // Возвращаем результат
        return $result;
    }
    else {
        $result = "0".$rub_u." 0".$kop_u;
        return $result;
    }}
 
На сцену вывожу короткий вариант, а Алисе скармливаю полный:
2.jpg
2.jpg (91.42 КБ) 2972 просмотра
Осталось сделать чтобы не выводил 06 копеек, а 6 копеек и не 61 рублей, а 61 рубль. Может кто подскажет?
Последний раз редактировалось dioxin Ср фев 15, 2017 4:22 pm, всего редактировалось 1 раз.
Алиска прописана на Debian 11 | Мой канал на youtube по MajorDomo
immortal
Сообщения: 1138
Зарегистрирован: Вт янв 29, 2013 9:16 am
Откуда: Белозерск
Благодарил (а): 16 раз
Поблагодарили: 402 раза
Контактная информация:

Re: Курс валюты с ЦБР

Сообщение immortal » Вт фев 14, 2017 9:49 pm

вот функция прописью
сумма прописьюПоказать

Код: Выделить всё

num2str(154268.26);

function num2str($num) {
    $nul='ноль';
    $ten=array(
        array('','один','два','три','четыре','пять','шесть','семь', 'восемь','девять'),
        array('','одна','две','три','четыре','пять','шесть','семь', 'восемь','девять'),
    );
    $a20=array('десять','одиннадцать','двенадцать','тринадцать','четырнадцать' ,'пятнадцать','шестнадцать','семнадцать','восемнадцать','девятнадцать');
    $tens=array(2=>'двадцать','тридцать','сорок','пятьдесят','шестьдесят','семьдесят' ,'восемьдесят','девяносто');
    $hundred=array('','сто','двести','триста','четыреста','пятьсот','шестьсот', 'семьсот','восемьсот','девятьсот');
    $unit=array( // Units
        array('копейка' ,'копейки' ,'копеек',     1),
        array('рубль'   ,'рубля'   ,'рублей'    ,0),
        array('тысяча'  ,'тысячи'  ,'тысяч'     ,1),
        array('миллион' ,'миллиона','миллионов' ,0),
        array('миллиард','милиарда','миллиардов',0),
    );
    //
    list($rub,$kop) = explode('.',sprintf("%015.2f", floatval($num)));
    $out = array();
    if (intval($rub)>0) {
        foreach(str_split($rub,3) as $uk=>$v) { // by 3 symbols
            if (!intval($v)) continue;
            $uk = sizeof($unit)-$uk-1; // unit key
            $gender = $unit[$uk][3];
            list($i1,$i2,$i3) = array_map('intval',str_split($v,1));
            // mega-logic
            $out[] = $hundred[$i1]; # 1xx-9xx
            if ($i2>1) $out[]= $tens[$i2].' '.$ten[$gender][$i3]; # 20-99
            else $out[]= $i2>0 ? $a20[$i3] : $ten[$gender][$i3]; # 10-19 | 1-9
            // units without rub & kop
            if ($uk>1) $out[]= morph($v,$unit[$uk][0],$unit[$uk][1],$unit[$uk][2]);
        } //foreach
    }
    else $out[] = $nul;
    $out[] = morph(intval($rub), $unit[1][0],$unit[1][1],$unit[1][2]); // rub
    $out[] = $kop.' '.morph($kop,$unit[0][0],$unit[0][1],$unit[0][2]); // kop
    return trim(preg_replace('/ {2,}/', ' ', join(' ',$out)));
}
function morph($n, $f1, $f2, $f5) {
    $n = abs(intval($n)) % 100;
    if ($n>10 && $n<20) return $f5;
    $n = $n % 10;
    if ($n>1 && $n<5) return $f2;
    if ($n==1) return $f1;
    return $f5;
}
а графики будут строится при таком формате?
может добавить в функцию priceToRublesAndKopeck

Код: Выделить всё

    if ($format == 'micro') {
            $rub_u = "."; $kop_u = "";
        }
Lubuntu на cubieboard2 + ds9490R
DietPi на Orange Pi PC + 1wire на esp8266 с прошивкой Homes-smart.ru
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Курс валюты с ЦБР

Сообщение xor » Вт фев 14, 2017 10:48 pm

Для графиков и для обмена крупных сумм)) достаточно брать курс как он есть - в рублях с четырьмя знаками после запятой

Код: Выделить всё

...
$dollar = str_replace(",",".",$valute);
sg("usd.value",$dollar); // <----  добавить свое свойство, будет  usd.value=58.0619
$dollar = substr($dollar,0,-2);
...
upd/И, всё-таки,далее лучше не отбрасывать 2 знака справа (substr($dollar,0,-2);), а округлять арифметически round'ом
Аватара пользователя
dioxin
Сообщения: 175
Зарегистрирован: Вт фев 14, 2017 4:43 pm
Откуда: Иваново
Благодарил (а): 15 раз
Поблагодарили: 46 раз

Re: Курс валюты с ЦБР

Сообщение dioxin » Ср фев 15, 2017 4:18 pm

Округлял я раундом, не катит. Ибо теряются копейки, а я хочу точную сумму знать))
Алиска прописана на Debian 11 | Мой канал на youtube по MajorDomo
Аватара пользователя
xor
Сообщения: 2045
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 289 раз
Поблагодарили: 633 раза

Re: Курс валюты с ЦБР

Сообщение xor » Ср фев 15, 2017 9:38 pm

Э, не катит?

Код: Выделить всё

Command: round(57.1455,2) 
Result:
57.15
А по-вашему будет 57.14

И, вообще, мы продаём или покупаем?)))
Ответить