使用 PHP 进行货币转换
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3282578/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Currency Conversion using PHP
提问by Click Upvote
I'm looking for a way to convert any amount from one currency to another on a website. The user would enter something like '100' and select USD as the currency, and then chooses Australian or Canadian dollars as the currency to convert to. When he clicks the 'Convert' button, I'd like to convert that amount automatically, through some API, and show him the amount in the currency he chose to convert to.
我正在寻找一种在网站上将任何金额从一种货币转换为另一种货币的方法。用户将输入类似“100”的内容并选择美元作为货币,然后选择澳元或加元作为要转换的货币。当他点击“转换”按钮时,我想通过一些 API 自动转换该金额,并向他显示他选择转换为的货币金额。
Any ideas?
有任何想法吗?
回答by Max
This method is using Yahoo currency API Full tutorial : Currency Converter in PHP, Python, Javascript and jQuery
此方法使用 Yahoo 货币 API 完整教程:PHP、Python、Javascript 和 jQuery 中的货币转换器
function currencyConverter($currency_from, $currency_to, $currency_input) {
$yql_base_url = "http://query.yahooapis.com/v1/public/yql";
$yql_query = 'select * from yahoo.finance.xchange where pair in ("' . $currency_from . $currency_to . '")';
$yql_query_url = $yql_base_url . "?q=" . urlencode($yql_query);
$yql_query_url .= "&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys";
$yql_session = curl_init($yql_query_url);
curl_setopt($yql_session, CURLOPT_RETURNTRANSFER, true);
$yqlexec = curl_exec($yql_session);
$yql_json = json_decode($yqlexec, true);
$currency_output = (float) $currency_input * $yql_json['query']['results']['rate']['Rate'];
return $currency_output;
}
$currency_input = 2;
//currency codes : http://en.wikipedia.org/wiki/ISO_4217
$currency_from = "USD";
$currency_to = "INR";
$currency = currencyConverter($currency_from, $currency_to, $currency_input);
echo $currency_input . ' ' . $currency_from . ' = ' . $currency . ' ' . $currency_to;
回答by TGuimond
An example of converting EUR to USD
将欧元转换为美元的示例
$url = 'http://www.webservicex.net/CurrencyConvertor.asmx/ConversionRate?FromCurrency=EUR&ToCurrency=USD';
$xml = simpleXML_load_file($url,"SimpleXMLElement",LIBXML_NOCDATA);
if($xml === FALSE)
{
//deal with error
}
else {
$rate = $xml;
}
回答by Ankit Gandhi
Use Given code for currency Converter PHP
为货币转换器 PHP 使用给定代码
public function convertCurrency($from, $to, $amount)
{
$url = file_get_contents('https://free.currencyconverterapi.com/api/v5/convert?q=' . $from . '_' . $to . '&compact=ultra');
$json = json_decode($url, true);
$rate = implode(" ",$json);
$total = $rate * $amount;
$rounded = round($total);
return $total;
}
回答by Amit Shukla
After searching a lot, found this.
找了很多,找到了这个。
// Fetching JSON
$req_url = 'https://api.exchangerate-api.com/v4/latest/USD';
$response_json = file_get_contents($req_url);
// Continuing if we got a result
if(false !== $response_json) {
// Try/catch for json_decode operation
try {
// Decoding
$response_object = json_decode($response_json);
// YOUR APPLICATION CODE HERE, e.g.
$base_price = 12; // Your price in USD
$EUR_price = round(($base_price * $response_object->rates->EUR), 2);
}
catch(Exception $e) {
// Handle JSON parse error...
}
}
This is working fine. The snippet is from: https://www.exchangerate-api.com/docs/php-currency-api
这工作正常。片段来自:https: //www.exchangerate-api.com/docs/php-currency-api
回答by AlexioVay
My 2017 solutionis a very lightweight function that gets the current exchange informations from the fixer.ioAPI. It also stores the exchange rate in a daily cookie to prevent further heavy web loading time. You can also choose Sessions for that or remove it:
我的 2017 解决方案是一个非常轻量级的函数,它从fixer.ioAPI获取当前的交换信息。它还将汇率存储在每日 cookie 中,以防止进一步繁重的网络加载时间。您还可以为此选择会话或将其删除:
function convertCurrency($amount, $from = 'EUR', $to = 'USD'){
if (empty($_COOKIE['exchange_rate'])) {
$Cookie = new Cookie($_COOKIE);
$curl = file_get_contents_curl('http://api.fixer.io/latest?symbols='.$from.','.$to.'');
$rate = $curl['rates'][$to];
$Cookie->exchange_rate = $rate;
} else {
$rate = $_COOKIE['exchange_rate'];
}
$output = round($amount * $rate);
return $output;
}
Example usage to convert 100 euro to pounds:
将 100 欧元转换为英镑的示例用法:
echo convertCurrency(100, 'EUR', 'GBP');
echo convertCurrency(100, 'EUR', 'GBP');
回答by user481996
I like the first solution but there seems to be on BIG problem with it. I tried to implement it into a payment gateway but I kept on getting a result of 1. This perplexed me and I eventually found that it is because there is a space used by google for the thousands sparator. Thus the amount of 1 500.00 was returned as one since the rest was exploded. I have created a quick and dirty fix for it. Let me know if anyone else has experienced this problem. Here is my solution:
我喜欢第一个解决方案,但它似乎存在大问题。我试图将它实现到支付网关中,但我一直得到 1 的结果。这让我感到困惑,我最终发现这是因为谷歌有一个空间用于数千个sparator。因此,自从其余部分爆炸后,1 500.00 的数量作为一个返回。我为它创建了一个快速而肮脏的修复程序。让我知道是否有其他人遇到过这个问题。这是我的解决方案:
function currency($from_Currency,$to_Currency,$amount) {
$amount = urlencode($amount);
$from_Currency = urlencode($from_Currency);
$to_Currency = urlencode($to_Currency);
$url = "http://www.google.com/ig/calculator?hl=en&q=$amount$from_Currency=?$to_Currency";
$ch = curl_init();
$timeout = 0;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT , "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1)");
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$rawdata = curl_exec($ch);
curl_close($ch);
$data = explode('"', $rawdata);
$data = explode('.', $data['3']);
$data[0] = str_replace(" ", "",preg_replace('/\D/', '', $data[0]));
if(isset($data[1])){
$data[1] = str_replace(" ", "",preg_replace('/\D/', '', $data[1]));
$var = $data[0].".".$data[1];
} else{
$var = $data[0];
}
return round($var,2); }
回答by Web Developer
This is what I'm using:
这是我正在使用的:
function exchangeRate( $amount, $from, $to)
{
switch ($from) {
case "euro":
$from_Currency = "EUR";
break;
case "dollar":
$from_Currency = "USD";
break;
case "pounds":
$from_Currency = "GBP";
break;
}
switch ($to) {
case "euro":
$to_Currency = "EUR";
break;
case "dollar":
$to_Currency = "USD";
break;
case "pound":
$to_Currency = "GBP";
break;
}
$amount = urlencode($amount);
$from_Currency = urlencode($from_Currency);
$to_Currency = urlencode($to_Currency);
$get = file_get_contents("https://www.google.com/finance/converter?a=$amount&from=" . $from_Currency . "&to=" . $to_Currency);
$get = explode("<span class=bld>",$get);
$get = explode("</span>",$get[1]);
$converted_amount = preg_replace("/[^0-9\.]/", null, $get[0]);
return round($converted_amount, 2);
}
回答by Justin Putney
I used the following PHP to pull data from the ECB as Stefan Gehrigsuggested.
正如Stefan Gehrig建议的那样,我使用以下 PHP 从欧洲央行提取数据。
<?php
try {
$xml_string = file_get_contents("https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");
$xml = new SimpleXMLElement($xml_string);
$cxml = $xml->xpath('//*[@currency]');
//anchored to USD in this case
$usx = $xml->xpath('//*[@currency="USD"]');
$base = floatval(strval($usx[0]['rate']));
//create a simple associative array with the 3-letter code
//as the key and the rate as the value
$c_arr = array();
foreach ($cxml as $c) {
$cur = strval($c['currency']);
$rate = floatval(strval($c['rate']))/$base;
$c_arr[$cur] = $rate;
}
//add the euro since it's assumed as the base rate for the ECB
$c_arr['EUR'] = 1/$base;
$currency_json = json_encode($c_arr);
//write to file
$file = "currency.json";
$fh = fopen($file, 'w') or die("can't open file");
fwrite($fh, $currency_json);
fclose($fh);
echo $currency_json;
} catch (Exception $e) { echo $e; }
?>
It writes a JSON file that I include as a JavaScript variable:
它编写了一个 JSON 文件,我将其作为 JavaScript 变量包含在内:
<script type="text/javascript">
var data = <?php include('currency.json'); ?>;
</script>
I can then easy grab the data using the 3-letter currency code (e.g., data['GBP']) with JavaScript when a currency change is requested.
然后,data['GBP']当请求更改货币时,我可以通过 JavaScript使用 3 个字母的货币代码(例如)轻松获取数据。
I use a Cron Job to update the JSON once a day, so it's not making a call each time the page is visited.
我使用 Cron 作业每天更新一次 JSON,因此每次访问页面时都不会进行调用。
回答by gabberfun
/**
* Rechnet den gegebenen Betrag von einer W?hrung in eine andere um
* @param FLOAT $value
* @param STRING $fromCurrency=USD Ursprungsw?rung des Betrags
* @param STRING $toCurrency=EUR Zielw?rhung, in die umgerechnet wird
* @param BOOL $round=true Wenn aktiviert, wird der errechnete Wert auf 2 Nachkommastellen kaufm?nnisch gerundet
* @return ARRAY [timestamp][datetime_iso][datetime_de][value][from][to][result]
*/
function calcCurrency($value=0, $fromCurrency='USD', $toCurrency='EUR', $round=true) {
$timestamp = time();
$fromCurrency = preg_replace('[^A-Z]', '', strtoupper(trim($fromCurrency)));
$toCurrency = preg_replace('[^A-Z]', '', strtoupper(trim($toCurrency)));
$round = (bool) $round;
$wrongJSON = file_get_contents("http://www.google.com/ig/calculator?hl=en&q=1$fromCurrency=?$toCurrency");
$search = array('lhs', 'rhs', 'error', 'icc');
$replace = array('"lhs"', '"rhs"', '"error"', '"icc"');
$json = str_replace($search, $replace, $wrongJSON);
$jsonData = json_decode($json, true);
if ('' !== $jsonData['error']) throw new Exception('FEHLER: '.$jsonData['error']);
$rhs = explode(' ', $jsonData['rhs'], 2);
$calcValue = floatval(0.00);
$value = floatval($value);
$ratio = floatval($rhs[0]);
// Gültigkeitsprüfungen
if ($value < 0) throw new Exception('Umzurechnender Wert darf nicht negativ sein.');
// Plausibilit?tsprüfung der eingestellten W?hrung und Festlegung
if ($toCurrency == $fromCurrency) {
// Ursprungsw?hrung = Zielw?hrung | Es erfolgt keine Berechnung
$calcValue = $value;
$ratio = 1;
} else {
$calcValue = floatval($value * $ratio);
}
// Array mit Rückgabewerten erzeugen und zurück geben
return array(
'timestamp' => $timestamp,
'datetime_iso' => date('Y-m-d H:i:s', $timestamp),
'datetime_de' => date('d.m.Y H:i:s', $timestamp),
'value' => $value,
'from' => $fromCurrency,
'to' => $toCurrency,
'ratio' => round($ratio, 6),
'result' => (true===$round)
? round($calcValue, 2)
: $calcValue
);
}
回答by technico
use this simple function :
使用这个简单的功能:
function convertCurrency($amount, $from, $to){
$url = "https://www.google.com/finance/converter?a=$amount&from=$from&to=$to";
$data = file_get_contents($url);
preg_match("/<span class=bld>(.*)<\/span>/",$data, $converted);
$converted = preg_replace("/[^0-9.]/", "", $converted[1]);
return round($converted, 3);
}

