Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вывод курса валют (https://javascript.ru/forum/misc/72548-vyvod-kursa-valyut.html)

spinastr 07.02.2018 02:12

Вывод курса валют
 
Здравствуйте!

Подскажите пожалуйста я полный ноль в json и js

Нужно вывести курс доллара со стрелкой в блок class или id. Дальше я сам могу.

Есть такой скрипт

там уже готовый вариант, просто вставить и всё. Но там показывает не точный курс в формате jsonp

есть вариант с точным курсом, там простой json


Пожалуйста помогите вывести курс в div блок?

spinastr 07.02.2018 02:48

Подскажите, пожалуйста, тут есть кто?

j0hnik 07.02.2018 03:16

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<div id="usd"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
$.getJSON("https://www.cbr-xml-daily.ru/daily_json.js", function(data) {
    $('#usd').html(data.Valute.USD.Nominal+" Доллар -> "+ data.Valute.USD.Value+" Рублей");
});
</script>
</body>
</html>

spinastr 07.02.2018 03:34

Ух ты так просто, спасибо огромное, а можно немного сократить?

57.2196 так 57.21

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


Иконки не работают

<script>
$.getJSON("https://www.cbr-xml-daily.ru/daily_json.js", function(data) {
    $('#usd').html(data.Valute.USD.Nominal+" <i class="fa fa-usd" aria-hidden="true"></i> "+ data.Valute.USD.Value+" <i class="fa fa-rub" aria-hidden="true"></i>");
});
</script>

spinastr 07.02.2018 03:50

Когда выводится пишется число "1" - 1$ 57.2196 руб. Как его убрать?

j0hnik 07.02.2018 10:22

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
<div id="usd"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script defer src="https://use.fontawesome.com/releases/v5.0.6/js/all.js"></script>

<script>
$.getJSON("https://www.cbr-xml-daily.ru/daily_json.js", function(data) {
    $('#usd').html((data.Valute.USD.Value<data.Valute.USD.Previous?'<i class="fas fa-long-arrow-alt-down"></i>':'<i class="fas fa-long-arrow-alt-up"></i>')+'<i class="fas fa-dollar-sign"></i>'+data.Valute.USD.Value.toFixed(2)+' <i class="fas fa-ruble-sign"></i>');
});
</script>
</body>
</html>

laimas 07.02.2018 10:42

Лучше сократить:

....
var usd = data.Valute.USD;
$('#usdv').html('<i class="fas fa-long-arrow-alt-'+(usd.Value < usd.Previous ? 'down' : 'up')+....


PS. Это замечанию автору. Если сайт завязан на фондовый рынок или товарную биржу, тогда да, динамика курса валюты важна. Но если сайт, это магазин бубликов, то динамически изменяемый курс вреден. Курс валют устанавливается по окончании торгов на валютной бирже, и запрос к СБ нужно делать только один раз - если в локальном хранилище нет курса или локальное хранилище содержит курс не текущей даты.

Dilettante_Pro 07.02.2018 13:07

laimas,
Цитата:

Сообщение от laimas
динамически изменяемый курс вреден

Это не динамически изменяемый курс - это курс валют Центробанка, устанавливаемый на текущую дату

laimas 07.02.2018 13:20

Цитата:

Сообщение от Dilettante_Pro (Сообщение 477182)
Это не динамически изменяемый курс - это курс валют Центробанка, устанавливаемый на текущую дату

Курс валюты ЦБ устанавливается один раз по окончанию торгов на валютной бирже. А вот в течении дня он может колебаться. Представьте магазин в котором в течении дня цены скачут. :) Они минимум в течении недели стабильные.

Dilettante_Pro 07.02.2018 14:03

Цитата:

Сообщение от laimas
А вот в течении дня он может колебаться.

Курс Центробанка в течение дня не колеблется. А загружается именно он.Центробанк

spinastr 07.02.2018 14:12

Спасибо, вам)))

У меня обычный портал города))) С погодой и новостями)

spinastr 07.02.2018 14:13

Вот так сделал как лучше?


<script> 
$.getJSON("https://www.cbr-xml-daily.ru/daily_json.js", function(data) { 
var Value = data.Valute.USD.Value 
var Previous = data.Valute.USD.Previous 
function trend(Value, Previous) { 
if (Value > Previous) return '<b style="color:#00ff00;"> ▲</b>'; 
if (Value < Previous) return '<b style="color:#ff0000;"> ▼</b>';
return ''; 
} 
var trend = trend(data.Valute.USD.Value, data.Valute.USD.Previous); 
 $('#usd').html("USD ЦБ&nbsp;&nbsp;" +data.Valute.USD.Value.toFixed(1) +trend); 
}); 
</script>

laimas 07.02.2018 14:14

Цитата:

Сообщение от Dilettante_Pro
Курс Центробанка в течение дня не колеблется.

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

laimas 07.02.2018 14:15

Цитата:

Сообщение от spinastr
У меня обычный портал города

Тогда динамика курса тоже имеет место быть. Главное как это "обзывается" на странице.

spinastr 07.02.2018 14:22

Я подумал, а как можно вывести два курса Доллара и евра на две даты?

Как на самок сайте ЦБ РФ ? Что бы было видно что будет дальше.

Подскажите?

laimas 07.02.2018 14:49

Цитата:

Сообщение от spinastr
как можно вывести два курса Доллара и евра на две даты?

Евро. Сделайте запрос браузером по этому адресу https://www.cbr-xml-daily.ru/daily_json.js. Посмотрите структуру ответа, посмотрите на код вывода, станет понятно.

Курс на период. Это надо на сайте СБ смотреть, я не могу сказать по данному запросу, я использую SOAP сервер СБ для получения курса, и в нем можно получить курсы за период. Возможно и в данном запросе такое есть, значит нужно будет просто передать определенные параметры в запросе.

spinastr 07.02.2018 14:53

Я просто не понимаю js

Можно вывести, курс доллара на сегодня и завтра, там есть два параметра

"Value": 57.2196,
"Previous": 56.6278

laimas 07.02.2018 15:01

Цитата:

Сообщение от spinastr
Можно вывести, курс доллара на сегодня и завтра, там есть два параметра

"Value": 57.2196,
"Previous": 56.6278

Это не сегодня и завтра, это будет справедливо (но не завтра, а вчера) только до начала торгов. В течении же торгов Previous, это предыдущий курс, а Value текущий.

Еще раз. Вы отображаете не установленный курс, а динамику курса. Если хотите отображать установленный курс, значит запрашивайте его один раз, до начала торгов, вот тогда Previous, это вчерашний, а Value сегодняшний курсы.

А еще правильнее, запрашивать курс за период, читайте API, параметры запроса, это не JS, понять не сложно.

spinastr 07.02.2018 15:24

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

laimas 07.02.2018 15:33

Цитата:

Сообщение от spinastr
Там два варианта, какой лучше?

В случае отображения евро и доллара

var Value = data.Valute.USD.Value
var Previous = data.Valute.USD.Previous

конечно же неверно.

spinastr 07.02.2018 16:04

Цитата:

Сообщение от laimas (Сообщение 477195)
В случае отображения евро и доллара

var Value = data.Valute.USD.Value
var Previous = data.Valute.USD.Previous

конечно же неверно.


что не верно? что то я запутался уже...)

laimas 07.02.2018 16:29

Цитата:

Сообщение от spinastr
что не верно?

Ну как можно по значениям доллара передаваемых в функцию вывести и значения евро? Если выводить курс двух валют, значит надо получить значения этих двух валют, поочередно передав их в функцию. Либо обходом объекта data в цикле, если ключ USD или EUR, получать значения и выводить, функции при этом не надо.

Но, если для Value (будем считать, что это текущий курс) можно сравнить с Previous и нарисовать стрелочку, то что и с чем нужно будет сравнивать для Previous (будем считать, что это вчерашний курс), чтобы нарисовать стрелочку? Не с чем. Ответ ищите на сайте СБ РФ в описании API и получайте курс валют за период. Если API этого запроса позволяет получать курсы только запрошенных валют, то и это учесть, чтобы не грузить лишнее.

spinastr 07.02.2018 16:31

Спасибо, теперь всё понятно.

Dilettante_Pro 07.02.2018 16:37

laimas,
Цитата:

Сообщение от laimas
Еще раз. Вы отображаете не установленный курс, а динамику курса. Если хотите отображать установленный курс, значит запрашивайте его один раз, до начала торгов, вот тогда Previous, это вчерашний, а Value сегодняшний курсы.

Еще раз. Это курсы Центробанка сегодняшний и вчерашний, и никакой динамики в течение дня. и никакой зависимости от времени торгов.
Пример j0hnik как в 3 ночи, так и сейчас показывает 57.2196. Завтра будет показывать новый курс

laimas 07.02.2018 16:51

Цитата:

Сообщение от Dilettante_Pro
Это курсы Центробанка сегодняшний и вчерашний

Я не использовал данный API, а поэтому прежде чем писать что-то смотрел запросы - результаты разные. Из этого я и делаю выводы. Если у вас они постоянные, значит нет демократии, ну или я не учел пояс часовой, а у меня разница большая. :)

А запрос надо делать все-таки один раз при любом раскладе.

laimas 07.02.2018 17:30

Dilettante_Pro,
все верно, дело в запросе, получается, что запрос браузером выдает курс по датам соответствующим текущей локальной минус день, а запрос скриптом выдаст курс по датам текущей локальной минус день, а вчерашняя уже минус два дня от текущей локальной. То есть в одном случае учитывается часовой пояс, в другом нет. А я не на дату посмотрел, а что там в USD вообще творится. Вот это подвело меня, зафиксировал изменение. :)

spinastr 08.02.2018 01:34

j0hnik,

По первому скрипту где курс доллара ещё не обновился, так как данные берутся со стороннего хостинга.

в интернете нашёл другой PHP скрипт.

ссылка на скрипт

демо

Третий простой скрипт

В этих скриптах данные уже берутся с оф сайта ЦБ РФ.

$url = 'http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1='.$date_yesterday.'&date_req2='.$date_today.'&VAL_NM_RQ='.$value ;


$link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date"; // Ссылка на XML-файл с курсами валют




Такой вопрос, вчера решали на форуме и не получилось.

У меня сайт на ucoz там не подключён php, поэтому я выбрал предыдущий вариант с json.

Есть хостинг на стороннем сайте. Загружаю туда скрипты они работаю, стрелки всё показывают.

Как можно перенести данные на юкоз где нет php Если между тегами <iframe></iframe> вставить ссылку на *.php то всё работает как информер.

Но мне нужно данные чиста отстилизовате через css что бы подходило под дизайн сайта.

Как с php хостинга перекинуть на сайт? простые значения например:

$ 56.77 ▲

Подскажите как нужно прописать? Если напрямую добавлять пхп скрипт на страницу то он не будет работать никакими манипуляциями, а нужно вывести значения примера выше.

spinastr 08.02.2018 04:23

Происходит что то непонятное!

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

https://www.cbr-xml-daily.ru/daily_json.js


laimas 08.02.2018 09:06

Эта бодяга убедила вчера меня в том, что это запрос динамики курса, так как я зафиксировал изменения трижды.

Курсы нужно получать с сайта ЦБ. Первый способ древний - получение xml (хотя в основе и других способов тоже xml). Для этого, например, запрос курса доллара за период 7-8 числа:

http://www.cbr.ru/scripts/XML_dynami...L_NM_RQ=R01235

Коды валют http://www.cbr.ru/scripts/XML_val.asp?d=0, прочая информация http://www.cbr.ru/development/SXML/.

Также есть SOAP сервер. Но все это доступно только через сервер, на клиенте доступ будет заблокирован. На убогом ucoz РНР есть, как подключить php скрипт читайте у них в техподдержке, есть и форум у них.

spinastr 08.02.2018 14:04

laimas,

Дело в том что я подключил php на стороне так как на юкоз очень дорого!

Вот и спрашиваю как можно передать значения на мой сайт из php ?

тут
решали этот вопрос не получилось

Подумал что тут может на js можно что то придумать!

spinastr 08.02.2018 14:13

Или можно как то в этот скрипт

<script> 
$.getJSON("https://www.cbr-xml-daily.ru/daily_json.js", function(data) { 
var Value = data.Valute.USD.Value 
var Previous = data.Valute.USD.Previous 
function trend(Value, Previous) { 
if (Value > Previous) return '<b style="color:#00ff00;"> ▲</b>'; 
if (Value < Previous) return '<b style="color:#ff0000;"> ▼</b>';
return ''; 
} 
var trend = trend(data.Valute.USD.Value, data.Valute.USD.Previous); 
 $('#usd').html("$&nbsp;&nbsp;" +data.Valute.USD.Value.toFixed(2) +trend); 
}); 
</script>


в див вывести в ( title="Посмотреть курс валют"><div id="usd"></div>)

подсказку в виде даты с которой берётся курс?

laimas 08.02.2018 14:20

Цитата:

Сообщение от spinastr
подсказку в виде даты с которой берётся курс?

Какую подсказку? В источнике указываются даты, получайте и выводите их куда надо. А вот это

if (Value > Previous) return '<b style="color:#00ff00;"> ▲</b>';
if (Value < Previous) return '<b style="color:#ff0000;"> ▼</b>';

чушь полная, так как возросла ли валюта или нет, можно узнать только для текущего курса относительно предыдущего.

j0hnik 08.02.2018 14:22

Цитата:

Сообщение от spinastr (Сообщение 477285)

подсказку в виде даты с которой берётся курс?

добавить
data.Date

spinastr 08.02.2018 14:27

Цитата:

Сообщение от laimas (Сообщение 477286)
Какую подсказку? В источнике указываются даты, получайте и выводите их куда надо. А вот это

if (Value > Previous) return '<b style="color:#00ff00;"> ▲</b>';
if (Value < Previous) return '<b style="color:#ff0000;"> ▼</b>';

чушь полная, так как возросла ли валюта или нет, можно узнать только для текущего курса относительно предыдущего.

Сейчас стрелка показывает вверх и на сайте цб тоже вверх.

(Про подсказку, просто что бы было видно за какое число данные)

Сейчас в json показывает курс на завтра


spinastr 08.02.2018 14:28

j0hnik,

так?

title="data.Date - Посмотреть курс валют"><div id="usd"></div>

spinastr 08.02.2018 14:30

j0hnik,
Скажите как из php скрипта, вывести данные на сайт на котором нет php, ? У меня есть да php скрипта которые выводят данные точно с ЧБ РФ. Подскажите как вывести?

Первый

Второй

В таком формате $ 56.77 ▲ на js

j0hnik 08.02.2018 14:36

title="Посмотреть курс валют"> - что это за тег?
в php я к сожалению не разбираюсь, может кто другой подскажет

spinastr 08.02.2018 14:43

j0hnik,

У меня панель на сайте, там бок div

<li><div class="wow fadeInLeft animated" style="visibility: visible; animation-name: bounceIn;"><a href="index/grafik_kursa_valjut/0-167" title="СЮДА ВЫВЕСТИ ДАТУ - Посмотреть курс валют"><div id="usd"></div> </div></a></li>



вывести в title.

Ещё вопрос если в php не разбираетесь можно js вывести данные с ЦБ РФ или нужно обязательно сервер с php?

laimas 08.02.2018 14:44

Цитата:

Сообщение от spinastr
Дело в том что я подключил php на стороне

Что значит на стороне? Если имеется ввиду, что на неком домене также своем, то клиент должен делать запрос к РНР скрипту на этом домене, который и будет отдавать курс. Если на этом домене есть и планировщик задач, то получение курса (запрос к ЦБ) нужно производить планировщиком раз в день. Полученный курс сохранять в базе, если БД нет, можно и в файл.

На запрос клиента к этому домену скрипт должен передавать заголовок "Access-Control-Allow-Origin: имя вашего домена", с которого клиент производит запрос.

Если при этом использовать SOAP сервер, то получение может быть таким:

if(PHP_SAPI == 'cli') {
    //установить директорию, все необходимые подключения производить относительно этой директории 
    chdir(dirname(__FILE__));

    try {
        //получение кураса доллара на текущую дату
        $client = new SoapClient("http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?wsdl"); 
        $curs = $client->GetCursOnDate(["On_date"=>date('Y-m-d')]);
        $rate = new SimpleXMLElement($curs->GetCursOnDateResult->any);
        $result = $rate->xpath('ValuteData/ValuteCursOnDate[VchCode="USD"]');
        $usd = (float)$result[0]->Vcurs/(int)$result[0]->Vnom;
        
        if($usd) {
            //здесь сохранение курса в базе
        }
    } catch (Exception $e) {
        
    }
}


Здесь описание методов севера. Если использовать запрос xml, то ответ сервера разобрать посредством SimpleXML и сохранить.

j0hnik 08.02.2018 14:49

<li>
	<div class="wow fadeInLeft animated" style="visibility: visible; animation-name: bounceIn;">
		<a href="index/grafik_kursa_valjut/0-167" title="СЮДА ВЫВЕСТИ ДАТУ - Посмотреть курс валют">
			<div id="usd"></div> 
		</div>
	</a>
</li>


Старайтесь форматировать, так будут ошибки заметнее.
Посмотрите внимательно


Часовой пояс GMT +3, время: 11:08.