github.com/keysonZZZ/kmg@v0.0.0-20151121023212-05317bfd7d39/kmgExchangeRate/kmgExchangeRate.go (about)

     1  package kmgExchangeRate
     2  
     3  import (
     4  	"fmt"
     5  	"time"
     6  
     7  	"github.com/bronze1man/kmg/encoding/kmgJson"
     8  	"github.com/bronze1man/kmg/kmgCache"
     9  	"github.com/bronze1man/kmg/kmgNet/kmgHttp"
    10  	"github.com/bronze1man/kmg/kmgStrconv"
    11  	"github.com/bronze1man/kmg/kmgStrings"
    12  	"github.com/bronze1man/kmg/kmgTime"
    13  )
    14  
    15  type yqlRateResponse struct {
    16  	Query struct {
    17  		Results struct {
    18  			Rate struct {
    19  				Rate string `json:"rate"`
    20  			} `json:"rate"`
    21  		} `json:"results"`
    22  	} `json:query`
    23  }
    24  
    25  //缓存时间为1天
    26  func MustGetExchangeRateWithCache(from string, to string) float64 {
    27  	b, err := kmgCache.FileTtlCache("MustGetExchangeRateWithCache_"+from+"_"+to, func() (b []byte, ttl time.Duration, err error) {
    28  		f := MustGetExchangeRate(from, to)
    29  		return []byte(kmgStrconv.FormatFloat(f)), kmgTime.Day, nil
    30  	})
    31  	if err != nil {
    32  		panic(err)
    33  	}
    34  	f, err := kmgStrconv.ParseFloat64(string(b))
    35  	if err != nil {
    36  		panic(err)
    37  	}
    38  	return f
    39  }
    40  
    41  func MustGetExchangeRate(from string, to string) float64 {
    42  	if !kmgStrings.IsAllAphphabet(from) {
    43  		panic(fmt.Errorf("[MustGetExchangeRate] fromName [%s] should like USD", from))
    44  	}
    45  	if !kmgStrings.IsAllAphphabet(to) {
    46  		panic(fmt.Errorf("[MustGetExchangeRate] toName [%s] should like USD", to))
    47  	}
    48  	if from == to {
    49  		panic(fmt.Errorf("[MustGetExchangeRate] fromName [%s] =toName [%s] "))
    50  	}
    51  	out := kmgHttp.MustUrlGetContent(kmgHttp.MustSetParameterMapToUrl("https://query.yahooapis.com/v1/public/yql", map[string]string{
    52  		"q":        fmt.Sprintf(`select * from yahoo.finance.xchange where pair="%s%s"`, from, to),
    53  		"format":   "json",
    54  		"env":      "store://datatables.org/alltableswithkeys",
    55  		"callback": "",
    56  	}))
    57  	//out should look like {"query":{"count":1,"created":"2015-06-01T02:37:44Z","lang":"en","results":{"rate":{"id":"JPYCNY","Name":"JPY/CNY","Rate":"0.0501","Date":"6/1/2015","Time":"3:37am","Ask":"0.0501","Bid":"0.0501"}}}}
    58  	resp := yqlRateResponse{}
    59  	kmgJson.MustUnmarshal(out, &resp)
    60  	if resp.Query.Results.Rate.Rate == "N/A" {
    61  		panic(fmt.Errorf("[MustGetExchangeRate] Currency [%s][%s] not exist", from, to)) //有一种货币不存在.
    62  	}
    63  	rate, err := kmgStrconv.ParseFloat64(resp.Query.Results.Rate.Rate)
    64  	if err != nil {
    65  		panic(err)
    66  	}
    67  	return rate
    68  }