1

私がやりたいことは、

  • このウェブサイトから換算レートを取得するには (必要な通貨 AZN <-> USD をサポートしているため、xe.com を選択しました)
  • たとえば、「5 AZN」を送信して、それと同等のものを米ドルで取得できる場合。URL は次のようになります: http://www.xe.com/ucc/convert/?Amount=5&From=AZN&To=USD

ブログから次のスニペットを取得しました。

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. buf変数と変数が何であるかわかりませんBUFFER_SIZE
  2. 正確な結果を取得するにはどうすればよいですか。たとえば5 AZN、USD で結果を送信して取得する (2 倍として)? http://www.xe.com/ucc/convert/?Amount=5&From=AZN&To=USD
4

2 に答える 2

1
  1. http://msdn.microsoft.com/fr-fr/library/system.io.stream.read.aspx

    buf は byte[] 配列で、メソッドが返されると、読み取ったデータが含まれます。BUFFER_SIZE は、読み取りたいデータのサイズです。1 バイトを読み取る場合は、BUFFER_SIZE=1 です。1 キロバイトのデータを読み込みたい場合は、BUFFER_SIZE=1024 などです。大きすぎるバッファを要求した場合 (たとえば、データが 1KB のときに 1MB を要求した場合) は、あまり問題になりません。KB を読み取り、戻ります。

  2. XE.com が変更を決定しない限り、最終的な文字列は次のようになります。

    XE.com: USD から EUR レート: 1.00 USD = 0.716372 EUR

    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()

注: コードスパークルの方法は、基本的にステップ 1 をスキップするため、はるかに簡単です。しかし、XE.com は API を提供していません。返された文字列が有効であるか、将来変更されないという保証はありません。

OK、ここにいくつかのコードがあります:

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);
}
于 2012-07-08T17:11:54.570 に答える
-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;
        }
    }
}

これは、すべての単語を double に解析し、inputvalue (変換する必要がある数値) に等しい double を無視しようとするはずです。これは、その値を取る文字列に他の個別の数字を追加するかのように、100% 正確ではありません。

于 2012-07-08T17:13:02.357 に答える