65.9K
CodeProject 正在变化。 阅读更多。
Home

免费兑换 – 免费为您的网站添加货币转换功能

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.21/5 (10投票s)

2005年3月17日

CPOL

3分钟阅读

viewsIcon

81069

downloadIcon

1094

一个简单的内联ASPX页面,可以显示不同货币的价格,并提供每日更新的汇率。

Sample Image

货币转换演示。

引言

本文介绍了一个简单的aspx页面,该页面使用“实时”汇率显示多种货币的价格。使用的汇率来自一个每天更新的公共领域源。该页面使用内联代码,因此无需分发DLL。

背景

当我开始销售自己的软件时,我希望购买过程尽可能顺畅。我也希望吸引所有访问我网站的人,而不是让潜在客户因为他们不住在我所在的国家而不得不拿出计算器。我总是惊讶于有多少网站仍然只以一种货币显示价格——通常是美元。

起初,我以为PayPal会提供答案,因为它具有国际功能。不幸的是,PayPal只支持有限数量的货币,而且货币转换需要付费。如果你的母语不是美元,而你的主要市场是美国,那么费用很快就会累加。

取而代之的是,我决定在母语价格旁边显示客户母语的大致价格。这样客户就能大致知道他们将要支付多少,但交易仍然以母语进行,因此没有转换费用。

即时转换价格很容易,但我希望汇率是动态的。

有几家汇率提供商,但我找到的所有电子数据都收费——而且一个数字似乎要价不菲!我找到了一些关于使用雅虎财经RSS提要的文章,但同样,法律上的小字让我感到不安。甚至还有一篇Code Project文章是关于转换XE.com的电子邮件的,但我想要更简单的东西。

本文介绍我的解决方案——从欧洲中央银行的公共领域文档中提取汇率信息,该文档每天更新。

我在我的网站上使用了这项技术,效果很好。

尽情享用!

使用代码

示例页面PricingDemo.aspx显示基本价格和一个货币下拉框。选择不同的货币并提交页面。getConversionRate函数查找货币的汇率。PrintPrice函数返回一个包含基本价格和所选货币价格的字符串。

要在您的页面上使用该代码,请将以下代码块复制到您的页面中

<script language="VB" runat="server">

  'Load the conversion rate file
  Public Function getConversionRate(ByVal sFromCurr _
         As String, ByVal sToCurr As String) As Double
   Dim req As HttpWebRequest
   Dim res As HttpWebResponse
   Dim srExRateData As StreamReader
   Dim sExRateData As String
   Dim separator As Char() = ","
   Dim dRate = 0, dRate1, dRate2 As Double
   Dim oExRateData As System.Xml.XmlDocument

   Const sExRateSource As String = _
     "http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml"

   Try
    oExRateData = New System.Xml.XmlDocument
    srExRateData = New _
      StreamReader(WebRequest.Create(sExRateSource)_
      .GetResponse().GetResponseStream(), _
      Encoding.ASCII)
    oExRateData.Load(srExRateData)
    srExRateData.Close()
    dRate1 = getEuroRate(oExRateData, sFromCurr)
    dRate2 = getEuroRate(oExRateData, sToCurr)
    dRate = dRate2 / dRate1
   Catch
   End Try
   Return dRate
  End Function

  'Get a rate note from the xml
  Function getEuroRate(ByRef oExRateData As _
    System.Xml.XmlDocument, ByVal sCurr As String) As Double

   Dim oExRateNode As System.Xml.XmlNode

   oExRateNode = oExRateData.SelectSingleNode("*/*/*/*[@currency='"_
                                                + sCurr + "']/@rate")
   If Not oExRateNode Is Nothing Then
     Return CDbl(oExRateNode.Value)
   Else
     Return 1
   End If
  End Function

 'Return the price
 Public Function PrintPrice(ByVal dPrice As Double, _
    ByVal dRate As Double, ByVal sCurr As String) As String

  Dim sReturn as string 

  if sCurr="USD" then sCurr="$US"
  if not sCurr="" then
    sReturn = (dRate * dPrice).ToString("#") & sCurr & "<sup>*</sup>  "
  end if
  sReturn += "GB£" & dPrice 
  return sReturn
 End Function

</script>
<%

 'Initialise exchange rates
 Dim sCurr as string ="USD" 'Default currency
 Dim oReqCurr as object =request("curr")
 if not oReqCurr is nothing then sCurr=oReqCurrr
 Dim dRate = getConversionRate("GBP",sCurr)
 Dim Price1 as string ="25.00" 
 Dim Price2 as string ="75.00"
 'End of initialisation
%>

通过粘贴以下内容到您的页面,并更改FORM标签的action以指向该页面,来添加更改货币下拉框和按钮。

<form method="post" action="ThisPage.aspx">
 <sup>*</sup> Approximate prices in my currency <br>
 <select name="curr">
  <option value="">Select Currency...</option>
  <Option Value="USD">US Dollar</Option>
  <Option Value="EUR">Euro</Option>
  <Option Value="JPY">Japanese Yen</Option>
  <Option Value="DKK">Danish Krone</Option>
  <Option Value="GBP">Pound Sterling</Option>
  <Option Value="SEK">Swedish Krona</Option>
  <Option Value="CHF">Swiss Franc</Option>
  <Option Value="ISK">Icelandic Krona</Option>
  <Option Value="NOK">Norwegian Krone</Option>
  <Option Value="BGN">Bulgarian Lev</Option>
  <Option Value="CYP">Cyprus Pound</Option>
  <Option Value="CZK">Czech Koruna</Option>
  <Option Value="EEK">Estonian Kroon</Option>
  <Option Value="HUF">Hungarian Forint</Option>
  <Option Value="LTL">Lithuanian Litas</Option>
  <Option Value="LVL">Latvian Lats</Option>
  <Option Value="MTL">Maltese Lira</Option>
  <Option Value="PLN">Polish Zloty</Option>
  <Option Value="ROL">Romanian Leu</Option>
  <Option Value="SIT">Slovenian Tolar</Option>
  <Option Value="SKK">Slovakian Koruna</Option>
  <Option Value="TRY">New Turkish Lira</Option>
  <Option Value="AUD">Australian Dollar</Option>
  <Option Value="CAD">Canadian Dollar</Option>
  <Option Value="HKD">Hong Kong Dollar</Option>
  <Option Value="NZD">New Zealand Dollar</Option>
  <Option Value="SGD">Singapore Dollar</Option>
  <Option Value="KRW">South Korean Won</Option>
  <Option Value="ZAR">South African Rand</Option>
 </select>
 <input type="submit"  value="Change Currency"  name="cmdChange">
</form>

使用以下代码显示价格

<%=PrintPrice(Price1,dRate,sCurr)%>

要添加PayPal按钮,请使用类似这样的代码

<form target="paypal" 
  action="https://www.paypal.com/cgi-bin/webscr" method="post">

   <input type="image" 
      src="https://www.paypal.com/en_GB/i/btn/x-click-but22.gif" 
      border="0" name="submit" 
      alt="Make payments with PayPal - it's fast, free and secure!">
   <input type="hidden" name="add" value="1">
   <input type="hidden" name="cmd" value="_cart">
   <input type="hidden" name="business" value="<<<your PayPal email address>>>">
   <input type="hidden" name="item_name" value="<<Product Name>>">
   <input type="hidden" name="item_number" value="<<<Product Code>>>">
   <input type="hidden" name="amount" value="<%=GFLitePrice%>">
   <input type="hidden" name="no_note" value="1">
   <input type="hidden" name="currency_code" value="GBP">
</form>

显然,您可以根据需要自定义PrintPrice

工作原理

该页面使用欧洲中央银行的每日汇率数据,该数据以XML格式在此处发布。

数据集包含欧元兑换率。要转换,例如,英镑兑美元,getConversionRate函数只需查找欧元兑英镑的汇率,以及欧元兑美元的汇率,使用getEuroRate。如果您恰好兑换到或从欧元兑换,getEuroRate返回1,因此其中一个汇率将被忽略。

怀念经典ASP?

ASP.NET很棒,但有时,我想念经典ASP。能够编写一个页面而不必担心编译DLL并上传它,这很好,所以我决定使用内联代码。似乎没有多少关于aspx内联代码的文档,但这很简单。

主要的“技巧”是

  1. <script language="VB" runat="server"> </script>块中声明您的函数。
  2. 使用<% ...... %>标签将代码插入HTML中,就像经典ASP一样。
  3. 要获取从表单提交的信息,请使用类似这样的结构
    Dim oReqCurr as object =request("curr")

更多待办事项

我不喜欢我的网页会因为ECB网站出现故障而无法显示价格的想法。所以我想修改代码,使XML在本地缓存,并且只有在过期一天时才更新。

请评论

这是我的第一篇CodeProject文章,我将不胜感激您的反馈。好?坏?有趣?有用?让我发笑?让我哭泣?请告诉我……

© . All rights reserved.