web 汇率

http://www.cnblogs.com/beimeng/p/3789940.html

网站虽小,五脏俱全(干货)

前言

最近一个朋友让帮忙做一个汇率换算的网站,用业余时间,到最后总算是实现了其需要的功能,其中也用到了一些相关的技术,把它写出来,给大家做一个参考,也给自己一个总结!

需求

1.按指定需求根据最新汇率进行汇率的换算,这就需要得到最新的汇率值

2.实现QQ弹出对话功能

3.后台返回换算后的money,汇率,服务费等数据

4.实现页面无刷新

具体实现一:前台代码实现

前台就是界面的布局,一些HTML代码,前台不是很熟,大家就不用挑剔了,看看界面实现就行了。主要的一个实现就是QQ弹出对话功能,QQ号码换成自己的了。各位有需要的看官可以直接copy此功能

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>澳元人民币汇率计算</title>
    <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
    <script src="Scripts/cc.js" type="text/javascript"></script>
<style type="text/css">
#img{ background-image: url(Image/bg2.jpg);
width:710px;
height:250px;
margin-left:40px;}
 .top      { display:block;
             margin-top:5px;
             margin-bottom:5px;
             line-height:30px;}
 .wenzi{ font-size:12px;}
 .shuomingli{border-bottom: #930 2px solid;
             display:block;
             margin-top:5px;
             margin-bottom:5px;
             line-height:30px;}
 a{ color: #03F;
 text-decoration:none;}
 a:hover{ color:#F00;}
</style>
</head>

<body>

  <div style="margin:30px auto; padding:0px; width:750px;">
     <div id="img">
     </div>
<form id="form1" runat="server">
      <ul style="list-style:none;">
        <li style="background: #900; height:25px;"><span style="color:#FFF; font-size:14px;line-height:25px;">&nbsp;&nbsp;<b>汇率计算:</b></span>
        </li>
        <li class="top"><span style="font-size:14px;">需要<span style="color:#C00;"><strong>兑换</strong></span>的<span style="color: #C00;"><strong>人民币</strong></span>:</span><input id="txtAmount" type="text" /><span style="font-size:14px;">&nbsp;汇率为:&nbsp;<input id="rate"  style="width:90px;" type="text" readonly="readonly"/></span><span style="font-size:14px;">&nbsp;服务费为:&nbsp;<input id="serverCharge"  style="width:100px;" type="text" readonly="readonly"/></span><a href="tencent://message/?Menu=yes&uin=331341164&Service=200&sigT=dcfc1fdf4a83b1602a334a540048009f26d65d6f377f8dc66c97d8ecc64228e8b8441583f92b707a"><span><img  style=" border:0px; vertical-align: middle; padding-bottom:5px; padding-left:2px;" src="Image/button_11.gif"></span></a>
        </li>
        <li class="top"><span style="font-size:14px;">需要<span style="color:#C00;"><strong>支付</strong></span>的<span style="color:#C00;"><strong>澳&nbsp;&nbsp;元</stong></span>:</span><input id="txtPay" type="text" readonly="readonly"/><input id="submit" style=" background-color: #CCC" type="button" value="计算" />
        <li class="top"><span style="font-size:12px;">最新汇率查询:<a href="http://www.boc.cn/sourcedb/whpj/" target="_Blank">&nbsp;&nbsp;中国银行实时汇率</a></span>
        </li>
       </ul>
</form>
        <ul style="list-style:none;">
         <li style="background: #900; height:25px;"><span style="line-height:25px; font-size:14px; color:#FFF;"><b>&nbsp;&nbsp;兑换说明:</b></span>
        </li>
        <li class="shuomingli"><span class="wenzi">1.以上兑换所用基础汇率均为最新汇率,可以查询相关网站以验证。</span>
        </li>
        <li class="shuomingli"><span class="wenzi">2.所使用汇率由兑换人民币钱数多少决定。兑换钱数越多汇率越接近实时汇率。
       </span>
        </li>
        <li class="shuomingli"><span class="wenzi">3.经以上步骤所得的价格最后再加5%的服务费即为最所需要您支付的澳元总额,若多次交易者手续费可商议而定。</span>
        </li>
        <li class="shuomingli"><span class="wenzi">4.如有问题请联系QQ:331341164</span>
        </li>

      </ul>
  </div>

</body>
</html>

具体实现二:最新汇率的获取

最好的实现当然是通过付费的webservices来获取最新的实时汇率,但是咱这只是一个简单的实现,我是通过抓取《中国银行外汇牌价》来得到汇率值,其中用到了一个HTML解析组件:HtmlAgilityPack,大家可以去了解一下,具体实现参考了网上的一些demo,代码如下:

       /// <summary> 获取远程HTML内容</summary>
        /// <param name="url">远程网页地址URL</param>
        /// <returns>成功返回远程HTML的代码内容</returns>
        private string GetWebContent(string strUrl)
        {
            string str = "";
            try
            {
                WebClient wc = new WebClient();
                wc.Credentials = CredentialCache.DefaultCredentials;
                Encoding enc = Encoding.GetEncoding("UTF-8");// 如果是乱码就改成 UTF-8 / GB2312
                Stream res = wc.OpenRead(strUrl);//以流的形式打开URL
                StreamReader sr = new StreamReader(res, enc);//以指定的编码方式读取数据流
                str = sr.ReadToEnd();//输出(HTML代码)
                res.Close();

                wc.Dispose();
            }
            catch (Exception ex)
            {
                return "";
            }
            return str;
        }

        private DataTable GetRateTable(string strHtml)
        {

            DataTable dt = new DataTable();
            DataColumn col1 = new DataColumn("Currency Name", typeof(string));
            DataColumn col2 = new DataColumn("Buying Rate", typeof(string));
            DataColumn col3 = new DataColumn("Cash Buying Rate", typeof(string));
            DataColumn col4 = new DataColumn("Selling Rate", typeof(string));
            DataColumn col5 = new DataColumn("Cash Selling Rate", typeof(string));
            DataColumn col6 = new DataColumn("Middle Rate", typeof(string));
            DataColumn col7 = new DataColumn("Pub Time", typeof(string));

            dt.Columns.Add(col1);
            dt.Columns.Add(col2);
            dt.Columns.Add(col3);
            dt.Columns.Add(col4);
            dt.Columns.Add(col5);
            dt.Columns.Add(col6);
            dt.Columns.Add(col7);

            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            doc.LoadHtml(strHtml);

            doc.OptionOutputAsXml = true;
            HtmlAgilityPack.HtmlNode node = doc.DocumentNode.SelectSingleNode(".//table[tr/th=\"Currency Name\"]");
            if (node == null)
            {
                return null;
            }
            HtmlAgilityPack.HtmlNodeCollection trNodeList = node.SelectNodes("tr[td]");

            foreach (HtmlAgilityPack.HtmlNode trNode in trNodeList)
            {
                DataRow dr = dt.NewRow();
                for (int j = 0; j < 7; j++)
                {
                    HtmlAgilityPack.HtmlNodeCollection tdNodeList = trNode.SelectNodes("td");
                    dr[j] = tdNodeList[j].InnerText.Replace("&nbsp;", " "); ;
                }
                dt.Rows.Add(dr);
            }
            return dt;
        }

        /// <summary>
        /// 根据国家的代码编号,得到汇率值
        /// </summary>
        /// <param name="No">国家代码</param>
        /// <returns></returns>
        private decimal GetRateByCountryNo(string No)
        {
            decimal rate = 0M;
            try
            {
                string html = GetWebContent("http://www.boc.cn/sourcedb/whpj/enindex.html").Trim();
                DataTable dt = GetRateTable(html);
                if (dt == null)
                    rate = 0M;
                else
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if (dt.Rows[i]["Currency Name"].ToString() == No)
                        {
                            rate = Convert.ToDecimal(dt.Rows[i]["Cash Buying Rate"].ToString()) / 100;
                        }
                    }
                }
            }
            catch (Exception)
            {
                rate = 0M;
            }
            return rate;
        }

具体实现三:后台数据到前台展示

因为是返回多个数据,返回的josn格式的数据,其中用到了序列化组件:Newtonsoft.Json.Net20,将需要返回的数据全部装在一个数据实体类里面,然后进行序列化,返回到前台,再进行解析,后台代码如下:

    public class Handler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            WebClient web = new WebClient();
            //string url = string.Format("http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s={0}{1}=X", "AUD", "CNY");
            //string response = web.DownloadString(url);
            //string[] values = Regex.Split(response, ",");
            decimal rate = GetRateByCountryNo("AUD");
            decimal amount = 0M;
            //decimal result = 0M;
            string returnStr = "";
            if (rate == 0M)
                returnStr = ToJson("通信出错,请稍后再试........");
            else
            {
                try
                {
                    ReturnModel model = new ReturnModel();
                    amount = System.Convert.ToDecimal(context.Request["amount"]);
                    //decimal rate = 5.82M;//System.Convert.ToDecimal(values[1]);
                    if (amount > 0 && amount <= 1000)
                    {
                        model.Rate = Math.Round(rate - 0.6M, 2);
                        model.Result = Math.Round(amount / model.Rate, 2);
                        model.ServerCharge = Math.Round(model.Result * 0.05M, 2);
                    }
                    else if (amount > 1000 && amount <= 5000)
                    {
                        model.Rate = Math.Round(rate - 0.4M, 2);
                        model.Result = Math.Round(amount / model.Rate, 2);
                        model.ServerCharge = Math.Round(model.Result * 0.05M, 2);
                    }
                    else if (amount > 5000)
                    {
                        model.Rate = Math.Round(rate - 0.3M, 2);
                        model.Result = Math.Round(amount / model.Rate, 2);
                        model.ServerCharge = Math.Round(model.Result * 0.05M, 2);
                    }
                    returnStr = ToJson(model);
                }
                catch (Exception)
                {
                    returnStr = ToJson("输入金额错误");
                }
            }
            context.Response.Write(returnStr);
        }
        /// <summary>
        /// 将object对象进行序列化
        /// </summary>
        /// <param name="t"></param>
        /// <returns></returns>
        public static string ToJson(object t)
        {
            return JsonConvert.SerializeObject(t, Formatting.Indented,
new JsonSerializerSettings { NullValueHandling = NullValueHandling.Include });
        }
}

具体实现四:ajax实现及前台数据解析

无刷新实现通过jquery 封装的ajax来实现,直接上代码:

$(document).ready(function () {
    $(‘#submit‘).click(function () {
        var errormsg = "";
        var amount = $(‘#txtAmount‘).val();
        $.ajax({ type: "POST",
            url: "Handler.ashx",
            data: { amount: amount },
            contentType: "application/x-www-form-urlencoded",
            dataType: "json",
            beforeSend: function () {
                $(‘#txtPay‘).val("正在转换...");
            },
            success: function (data) {
                $(‘#txtPay‘).val(data.Result);
                $(‘#rate‘).val(data.Rate);
                $(‘#serverCharge‘).val(data.ServerCharge);
            },
            error: function (jqXHR, exception) {
                if (jqXHR.status === 0) {
                    errormsg = ‘Not connect.\n Verify Network.‘; ;
                } else if (jqXHR.status == 404) {
                    errormsg = ‘Requested page not found. [404]‘; ;
                } else if (jqXHR.status == 500) {
                    errormsg = ‘Internal Server Error [500].‘; ;
                } else if (exception === ‘parsererror‘) {
                    errormsg = ‘Requested JSON parse failed.‘; ;
                } else if (exception === ‘timeout‘) {
                    errormsg = ‘Time out error.‘; ;
                } else if (exception === ‘abort‘) {
                    errormsg = ‘Ajax request aborted.‘; ;
                } else {
                    errormsg = ‘Uncaught Error.‘;
                }
                alert(errormsg);
            }
        });
    });
});

总结

至此,一个小小的功能网站就算是完成了,主要关键步骤就是汇率的获取这里,也涉及其他的技术点,就说这么多吧,觉得好的给个赞!

源码下载:猛戳这里!

web 汇率,布布扣,bubuko.com

时间: 2024-10-17 20:06:32

web 汇率的相关文章

经验总结21--抓取WEB数据,汇率,HtmlAgilityPack

网上找了非常多资料,PHP的比較多,然后找到有csv文件的.处理起来非常麻烦,国外的站点速度非常慢. 最后还是去页面上抓取数据,我是从中国银行抓取的,各位可去其它站点抓取. 1.模拟请求URL. string url = "http://srh.bankofchina.com/search/whpj/search.jsp? pjname=1316"; HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; r

为什么使用 Web Services?

最重要的事情是协同工作 由于所有主要的平台均可通过 Web 浏览器来访问 Web,不同的平台可以借此进行交互.为了让这些平台协同工作,Web 应用程序被开发了出来. Web 应用程序是运行在 Web 上的简易应用程序.它们围绕 Web 浏览器标准被进行构建,几乎可被任何平台之上的任何浏览器来使用. Web services 把 Web 应用程序提升到了另外一个层面 通过使用 Web services,您的应用程序可向全世界发布功能或消息. Web services 使用 XML 来编解码数据,并

Web Service(一) 基础学习

1 基础的Web Service平台是XML+HTTP. 2 Web Service平台的元素包括:SOAP(Simple Object Access Protocol)简单对象访问协议: UDDI(Universal Description Discovery and Integration)通用描述.发现及整合:WSDL(Web Services Description Language)Web Service描述语言. 3 Web Service使用XML来编码数据,并使用SOAP借由开放

免费的天气Web Service接口

免费的天气Web Service接口 在android应用当中很多时候需要获取天气的信息,这里提供怎么获取天气信息: 1. http://www.ayandy.com/Service.asmx?wsdl 官网:http://www.ayandy.com 2. http://webservice.webxml.com.cn/WebServices/WeatherWS.asmx?wsdl 网站:http://www.webxml.com.cn/zh_cn/index.aspx ,此网站提供各种web

[label][转载][paypal]paypal在线支付接口的WEB语言设置

http://stephen830.iteye.com/blog/274072 ★★★ 本篇为原创,需要引用转载的朋友请注明:< http://stephen830.iteye.com/blog/274072 > ,谢谢支持!★★★ 以前曾经写过一篇关于<paypal在线支付的通信接口 http://stephen830.iteye.com/blog/254565 >的文章.对以前文章的一个补充: 自从国际paypal增加了繁体中文的WEB版本后,许多早先集成paypal接口的系统

调用百度汇率api 获取各国的汇率值

设置一个定时任务,每天更新汇率java代码如下 package com.thinkgem.jeesite.modules.huiLvApi.service; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.Date;

ASP.net webClient 汇率

WebClient汇率 简介 有个需求网站中需要美元汇率.这里通过webClient实现,这种还是比较简单,不涉及js跨域问题.还有注意点最好将查到的数据放在缓存中,缓存有效期设为1小时,防止频繁问汇率网站给锁死. 实现 1.现将一个aspx页面,后台代码写法,通过访问该页面时传参 url获得汇率的接口. protected void Page_Load(objectsender, EventArgs e) { System.Net.WebClient wc = new System.Net.W

Web services 有两种类型的应用

可重复使用的应用程序组件 有一些功能是不同的应用程序常常会用到的.那么为什么要周而复始地开发它们呢? Web services 可以把应用程序组件作为服务来提供,比如汇率转换.天气预报或者甚至是语言翻译等等. 比较理想的情况是,每种应用程序组件只有一个最优秀的版本,这样任何人都可以在其应用程序中使用它. 连接现有的软件 通过为不同的应用程序提供一种链接其数据的途径,Web services有助于解决协同工作的问题. 通过使用 Web services,您可以在不同的应用程序与平台之间来交换数据.

Web Services简单介绍

Web Services简单介绍 Web Services入门 一.Web Services简介 1.什么是Web Services? Web Services 是应用程序组件 Web Services 使用开放协议进行通信 Web Services 是独立的(self-contained)并可自我描述 Web Services 可通过使用UDDI来发现 Web Services 可被其他应用程序使用 XML 是 Web Services 的基础 2.它如何工作? 基础的 Web Service