【问题标题】:Get currency rate获取货币汇率
【发布时间】:2012-07-08 17:00:11
【问题描述】:

我想做的是,

我从a blog获取了以下sn-p:

string xeString = String.Format("http://www.xe.com/ucc/convert.cgi?Amount=1&From={0}&To={1}", srcCurrency, dstCurrency);
System.Net.WebRequest wreq = System.Net.WebRequest.Create(new Uri(xeString));
System.Net.WebResponse wresp = wreq.GetResponse();
Stream respstr = wresp.GetResponseStream();
int read = respstr.Read(buf, 0, BUFFER_SIZE);
result = Encoding.ASCII.GetString(buf, 0, read);

现在,这将返回类似XE.com: USD to EUR rate: 1.00 USD = 0.716372 EUR 的内容

问题是:

  1. 我不知道变量bufBUFFER_SIZE 是什么。
  2. 我怎样才能得到准确的结果,例如发送5 AZN 并得到美元的结果(双倍)? http://www.xe.com/ucc/convert/?Amount=5&From=AZN&To=USD

【问题讨论】:

  • 我建议忘记WebRequest/WebResponse;请改用WebClient.DownloadStringWebClient.DownloadStringAsync...
  • @codesparkle 你能在代码上展示你的想法吗?
  • 看看example on MSDN,这不是火箭科学
  • 无论您选择何种方法来检索 html 内容,不要忘记这是非常不可靠的。您无法保证 xe.com 不会重新设计其页面布局,您的整个代码都会失败。您应该考虑寻找提供此类功能的网络服务。
  • 考虑使用openexchangerates.org(AZN 应该从明天开始可用,由于“来源不可靠”目前不可用)

标签: c# winforms networking


【解决方案1】:
  1. http://msdn.microsoft.com/fr-fr/library/system.io.stream.read.aspx

    buf 是一个 byte[] 数组,一旦方法返回,它就会包含您刚刚读取的数据。 BUFFER_SIZE 是您要读取的数据的大小。如果要读取单个字节,BUFFER_SIZE=1。如果要读取 1 KB 的数据,BUFFER_SIZE=1024 等。注意,如果您要求的缓冲区太大(例如,当数据为 1KB 时要求 1MB),则无关紧要。它将读取一个 KB,然后返回。

  2. 除非 XE.com 决定更改它,否则您的最终字符串应如下所示:

    XE.com:美元兑欧元汇率:1.00 美元 = 0.716372 欧元

    你可以使用 String 方法去除你不需要的东西:整个第一部分

    (XE.com: USD to EUR rate:)

    只需使用您的数据构建一个字符串即可轻松删除:

    (string header = "XE.com: {0} to {1} rate:", currency1, currency2)

    ,然后调用String.Replace(header, '')。从那里,您可以调用String.Split('='),在“=”符号处拆分,然后从拆分的字符串中删除货币部分(同样是String.Replace()),最后调用Double.TryParse()

注意:codesparkle 的方法更简单,因为你基本上跳过了第 1 步。但是 XE.com 没有提供 API:你不能保证返回的字符串是有效的,或者将来不会改变。

好的,这里有一些代码:

private double GetConvertedCurrencyValue(string inputCurrency, string outputCurrency, double value) 
{
    string request = String.Format(http://www.xe.com/ucc/convert.cgi?Amount={0}&From={1}&To={2}", value, inputCurrency, outputCurrency);

    System.Net.WebClient wc = new System.Net.WebClient();
    string apiResponse = wc.DownloadString(request);    // This is a blocking operation.
    wc.Dispose();

    /* Formatting */
    // Typical response: "XE.com: curr1 to curr2 rate: x curr1 = y curr2"
    // The first part, up until "x curr1" is basically a constant
    string header = String.Format("XE.com: {0} to {2} rate:" inputCurrency, outputCurrency);

    // Removing the header
    // The response now looks like this: x curr1 = y curr2
    apiResponse = apiResponse.Replace(header, "");

    // Let's split the response at '=', to retrieve the right part
    string outValue = apiResponse.Split('=')[1];

    // Getting rid of the 'curr2' part
    outValue = outValue.Replace(outputCurrency, "");

    return Double.Parse(outValue, System.Globalization.CultureInfo.InvariantCulture);
}

【讨论】:

  • 一个字节[]。一个变量,例如 byte[] data = new byte[1024];但说真的,使用codesparkle的方法(使用DownloadString())
  • 我是 C# 的新手。你能根据codeparkles的想法修改你的答案吗?提前谢谢
  • 请解释代码的第二个答案。对我来说很难理解。真的。提前谢谢
  • 运行代码时出现此错误:"\"w3.org/1999/xhtml\">\n\t\n\t\t\n
【解决方案2】:

删除了旧代码。这是迄今为止最准确的一个 EDIT2:

string[] words = result.Split(' ');
Double newresult;

foreach(string i in words)
{
    if(Double.TryParse(i) == true)
    {
        if(!Double.Parse(i).equals(inputValue))
        {
            newresult = Double.Parse(i);
            break;
        }
    }
}

这几乎应该尝试将每个单词解析为双精度并忽略等于输入值(需要转换的数字)的双精度。 这仍然不是 100% 准确,就好像他们将其他单独的数字添加到它采用该值的字符串一样。

【讨论】:

  • 这是一个非常非常非常糟糕的主意。如果明天,消息变成 'XE.com :' 怎么办?您只是有一个新空间,您将尝试解析 '='。
  • @pikzen 让它变得更好了一点,但如果字符串可以长期改变,你就不能 100% 准确。当然,除非你再次分词。检查是否可以使用 Double.TryParse() 将其解析为双精度,然后使其忽略您要转换的双精度并获取第二个。这很可能总是有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2011-02-19
  • 2012-01-04
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多