Avatar billede Driton Seniormester
20. februar 2018 - 19:59 Der er 16 kommentarer

Valuta converter realtime

Er der nogle der kender en valuta converter derude, som er gratis at gøre brug af? som er let anvendeligt til C#
Avatar billede arne_v Ekspert
20. februar 2018 - 20:09 #1
Du mener en public web service?
Avatar billede Driton Seniormester
20. februar 2018 - 20:12 #2
Ja
Avatar billede arne_v Ekspert
20. februar 2018 - 20:24 #3
Google finder adskillige ved soegning paa:
  public web service currency conversion

Jeg kan godt teste nogle af dem, men ......
Avatar billede Driton Seniormester
20. februar 2018 - 20:27 #4
Så bare nogle af dem ikke kunne bruges pågrund af de kostede, søgte også på google. Tænkte måske nogle herinde havde stiftet bekendskab med nogle af dem og kendte nogle gratis api'er men kunne bruge gratis. Så også at google havde deres egen, men siderne ser ikke ud til at virke :S
Avatar billede Driton Seniormester
20. februar 2018 - 22:44 #5
string fra = "DKK";
        string til = "EUR";

        WebClient web = new WebClient();
        string url = string.Format("http://www.google.com/ig/calculator?hl=en&q={2}{0}%3D%3F{1}", fra.ToUpper(), til.ToUpper(), 10);

        string response = web.DownloadString(url);

        Regex regex = new Regex("rhs: \\\"(\\d*.\\d*)");

        decimal rate = Convert.ToDecimal(regex.Match(response).Groups[1].Value);

        Console.Write(rate);

Denne løsning burde virke, men får fejl på konvertering af Convert.ToDecimal(regex.Match(response).Groups[1].Value); Forkert format :S
Avatar billede Driton Seniormester
20. februar 2018 - 22:58 #6
Denne her giver mig  - The remote server returned an error: (403) Forbidden.

https://www.google.com/finance/converter?a={3}&from={1}&to={2}

Kan ikke finde en link derude der virker :(
Avatar billede Slettet bruger
21. februar 2018 - 00:31 #7
Er der sådan en her du leder efter?
http://www.valutakurser.dk/??
Avatar billede arne_v Ekspert
21. februar 2018 - 03:34 #8
Der er masser af rigtige web services derude.

Saa min ide var:
* find URL for WSDL
* add service reference
* brug soap client

Men de foerste 3 web services virkede dog ikke, saa maaske er det et problem.

Men saa kan man jo kaste sig over nationalbankens service.


using System;
using System.Collections.Generic;
using System.Globalization;
using System.Xml;

namespace E
{
    public class Program
    {
        private static IDictionary<string, XmlDocument> cache = new Dictionary<string, XmlDocument>();
        public static decimal GetRate(DateTime date, string currency)
        {
            if(currency == "DKK") return 100.00m;
            string datestr = date.ToString("yyyy-MM-dd");
            XmlDocument doc;
            if(cache.ContainsKey(datestr))
            {
                doc = cache[datestr];
            }
            else
            {
                doc = new XmlDocument();
                doc.Load("http://www.nationalbanken.dk/_vti_bin/DN/DataService.svc/CurrencyRatesHistoryXML?lang=da");
                cache[datestr] = doc;
            }
            XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
            xnm.AddNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01");
            xnm.AddNamespace("default", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");
            string ratestr = doc.SelectSingleNode("/gesmes:Envelope/default:Cube/default:Cube[@time='" + datestr + "']/default:Cube[@currency='" + currency + "']/@rate", xnm).Value;
            return decimal.Parse(ratestr,  new CultureInfo("da-DK", false));
        }
        public static decimal Convert(DateTime date, decimal amount, string fromcurrency, string tocurrency)
        {
            decimal fromrate = GetRate(date, fromcurrency);
            decimal torate = GetRate(date, tocurrency);
            return amount * fromrate / torate;
        }
        public static decimal Convert(decimal amount, string fromcurrency, string tocurrency) {
            return Convert(DateTime.Now, amount, fromcurrency, tocurrency);
        }
        public static void Main(string[] args)
        {
            Console.WriteLine(Convert(10.00m, "DKK", "EUR"));
            Console.WriteLine(Convert(10.00m, "DKK", "USD"));
            Console.ReadKey();
        }
    }
}


Lidt mere kode end genereret SOAP client udfra WSDL men ikke slemt.
Avatar billede Driton Seniormester
22. februar 2018 - 21:16 #9
Hvis nogle ønsker en løsning så har de en her, i stedet for at gennemsøge google :)
Avatar billede arne_v Ekspert
23. februar 2018 - 19:39 #10
Jeg synes bare at det er mere elegant med en SOAP service fremfor manuel parsning af XML.

Men tilsyneladende er der ikke nogen som har lyst til permanent at holde en saadan service koerende uden at faa penge for det.
Avatar billede Driton Seniormester
24. februar 2018 - 01:12 #11
Hvorfor får jeg fejl her

string ratestr = doc.SelectSingleNode("/gesmes:Envelope/default:Cube/default:Cube[@time='" + datestr + "']/default:Cube[@currency='" + currency + "']/@rate", xnm).Value;

Her nu? Det gjorde jeg ikke igår?
Avatar billede arne_v Ekspert
24. februar 2018 - 01:26 #12
Hmmm.

Den er over midnat i Danmark og filen har stadig kun for den 23/2.

Der skal nok lavet noget logik som tager igaar fremfor idag hvis det er meget tidligt.
Avatar billede Driton Seniormester
24. februar 2018 - 01:29 #13
Så med at fastsætte det? men hvordan opdateres den så? Så skal men gå hen til noget der koster vel?
Avatar billede arne_v Ekspert
24. februar 2018 - 01:47 #14
Nej - koden skal bare justeres lidt.

Proev:


using System;
using System.Collections.Generic;
using System.Globalization;
using System.Xml;

namespace E
{
    public class Program
    {
        private static IDictionary<string, XmlDocument> cache = new Dictionary<string, XmlDocument>();
        public static decimal GetRate(DateTime date, string currency)
        {
            if(currency == "DKK") return 100.00m;
            string datestr = date.ToString("yyyy-MM-dd");
            XmlDocument doc;
            if(cache.ContainsKey(datestr))
            {
                doc = cache[datestr];
            }
            else
            {
                doc = new XmlDocument();
                doc.Load("http://www.nationalbanken.dk/_vti_bin/DN/DataService.svc/CurrencyRatesHistoryXML?lang=da");
                cache[datestr] = doc;
            }
            XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
            xnm.AddNamespace("gesmes", "http://www.gesmes.org/xml/2002-08-01");
            xnm.AddNamespace("default", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref");
            XmlNode rateinfo = doc.SelectSingleNode("/gesmes:Envelope/default:Cube/default:Cube[@time='" + datestr + "']/default:Cube[@currency='" + currency + "']/@rate", xnm);
            if(rateinfo != null)
            {
                // current file has info for this date => we use that info
                string ratestr = rateinfo.Value;
                return decimal.Parse(ratestr,  new CultureInfo("da-DK", false));
            }
            else
            {
                // current file has info for this date => we try previous day
                cache.Remove(datestr);
                Console.WriteLine("recurse");
                return GetRate(date.AddDays(-1), currency);
            }
        }
        public static decimal Convert(DateTime date, decimal amount, string fromcurrency, string tocurrency)
        {
            decimal fromrate = GetRate(date, fromcurrency);
            decimal torate = GetRate(date, tocurrency);
            return amount * fromrate / torate;
        }
        public static decimal Convert(decimal amount, string fromcurrency, string tocurrency) {
            return Convert(DateTime.Now, amount, fromcurrency, tocurrency);
        }
        public static void Main(string[] args)
        {
            Console.WriteLine(Convert(10.00m, "DKK", "EUR"));
            Console.WriteLine(Convert(10.00m, "DKK", "USD"));
            Console.ReadKey();
        }
    }
}
Avatar billede Driton Seniormester
24. februar 2018 - 02:21 #15
Men med din kode, så skal vi formode, at listen bliver opdateret næste dag? fordi hvis den ikke bliver opdateret inden to dage, så burde den viser fejl igen?
Avatar billede arne_v Ekspert
24. februar 2018 - 02:40 #16
Nej - min kode fortsaette med at forsoege bagud, saa hvis ikke der bliver opdateret i weekenden og du forsoeger mandag tid morgen, saa vild en foerst gaa tilbage til soendag, og naar den fejler loerdag, og derfra til fredag.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester