none
Fonction ToDouble() de la classe convert qui renvoie une erreur RRS feed

  • Question

  • Bonjour !
    Je suis débutant en développement Windows Phone que j'apprends en parallèle de mes études. Je développe une application dont l'objectif est d'extraire des données sur des parkings (récupérées via un opendata) et j'ai un soucis avec la fonction ToDouble( string) appliquée aux coordonnées satellites de mon objet Parking qui me renvoie "NullReferenceException".

    public static List<Parking> getbddparking()
            {
                List<Parking> liste = new List<Parking>();
                //crée une nouvelle liste de parking
                var ressource = App.GetResourceStream(new Uri("Data/Parkings.txt", UriKind.RelativeOrAbsolute));
                StreamReader bddparking = new StreamReader(ressource.Stream);
                string ligne;
                while ((ligne = bddparking.ReadLine()) != null)
                {
                    string[] attributs = ligne.Split(';');
                    Parking a = new Parking();
                    a.nom = attributs[0];
                    a.adresse = attributs[1] + ' ' + attributs[2] + ' ' + attributs[3] + ' ' + attributs[4] + ' ' + attributs[5];
                    attributs[6]=attributs[6].Replace('.', ',');
                    attributs[7] = attributs[7].Replace('.', ',');
                    a.satcoord.Longitude = Convert.ToDouble(attributs[6]);
                    a.satcoord.Latitude = Convert.ToDouble(attributs[7]);
                    liste.Add(a);
                    }
                return liste;
            }
    J'ai un petit peu fouillé sur le forum et je n'ai pas trouvé de référence sur ce problème. De plus, en déboguant, et en regardant les variables locales en cours d’exécution, attributs[6] et [7] sont non null mais bien égaux à "3,44" et "43,22".


    Du coup je suis un petit peu coincé, avez vous une idée qui pourrait éventuellement me débloquer ?

    Merci !


    lundi 10 décembre 2012 23:04

Réponses

  • Hello,

    Cela me fait pensé à un problème de culture.
    Si tu veux que ce soit la culture anglais tu met un petit:

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

    Si tu veux que se soit la française:

    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

    En l’occurrence, évite les:

    attributs[6]=attributs[6].Replace('.', ',');
    Et bascule plutôt la culture en US.

    Cela résout ton problème?

    Cordialement,

    Mafyou.

    mardi 11 décembre 2012 08:49
  • Problème résolu !
    Grâce à vos suggestion j'ai remarqué que le problème ne venait pas de la fonction convert mais de ma classe parking et plus particulièrement de ma gestion des coordonnées satellite. J'ai donc créer une méthode qui me permet de les redéfinir proprement par étape et cela fonctionne.
    Voici le code :
    Loader :

    public class Loader
        {
            public static List<Parking> getbddparking()
            {
                List<Parking> liste = new List<Parking>();
                //crée une nouvelle liste de parking
                
                //Défini la culture comme étant Française car ma BDD contient des ','
                var ressource = App.GetResourceStream(new Uri("Data/Parkings.txt", UriKind.RelativeOrAbsolute));
                StreamReader bddparking = new StreamReader(ressource.Stream);
                string ligne;
                while ((ligne = bddparking.ReadLine()) != null)
                {
                    string[] attributs = ligne.Split(';');
                    Parking a = new Parking();
                    a.nom = attributs[0];
                    a.adresse = attributs[1] + ' ' + attributs[2] + ' ' + attributs[3] + ' ' + attributs[4] + ' ' + attributs[5];
                    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
                    Double longitude = Convert.ToDouble(attributs[6]);
                    Double latitude = Convert.ToDouble(attributs[7]);
                    a.setcoord(longitude, latitude);
                    liste.Add(a);
                    }
                return liste;
            }
    
        }

    Classe Parking :

    public class Parking
        {
            public System.Device.Location.GeoCoordinate satcoord { set; get; }
            public string adresse { set; get; }
            public string nom { set; get; }
    
            public string affiche() 
            {
            String Park = this.nom + " au : "+this.adresse;
            return Park;
            }
            public void setcoord(Double longitude, Double latitude )
            {
                System.Device.Location.GeoCoordinate coord = new System.Device.Location.GeoCoordinate(longitude, latitude);
                this.satcoord = coord;
            }
        }

    mardi 11 décembre 2012 10:24

Toutes les réponses

  • Bonjour,

    Le problème viens du fait que tu remplace les points par des virgules, le séparateur par défaut des doubles : en "interne", 1.5 == 1,5 en FR, la virgule représentant le séparateur de millier pour les currencies.


    Pour que la discussion puisse être identifiée comme résolue merci de marquer les réponses qui vous ont aidées à solutionner votre problème comme "réponse".

    mardi 11 décembre 2012 08:42
  • Hello,

    Cela me fait pensé à un problème de culture.
    Si tu veux que ce soit la culture anglais tu met un petit:

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

    Si tu veux que se soit la française:

    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");

    En l’occurrence, évite les:

    attributs[6]=attributs[6].Replace('.', ',');
    Et bascule plutôt la culture en US.

    Cela résout ton problème?

    Cordialement,

    Mafyou.

    mardi 11 décembre 2012 08:49
  • Je viens d'effectuer le changement en évitant la syntaxe de changement de caractère. En effet j'ai utilisé excel pour changer tous mes points en virgules. J'ai toujours le même problème.
    public static List<Parking> getbddparking()
            {
                List<Parking> liste = new List<Parking>();
                //crée une nouvelle liste de parking
                Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
                //Défini la culture comme étant Française car ma BDD contient des ','
                var ressource = App.GetResourceStream(new Uri("Data/Parkings.txt", UriKind.RelativeOrAbsolute));
                StreamReader bddparking = new StreamReader(ressource.Stream);
                string ligne;
                while ((ligne = bddparking.ReadLine()) != null)
                {
                    string[] attributs = ligne.Split(';');
                    Parking a = new Parking();
                    a.nom = attributs[0];
                    a.adresse = attributs[1] + ' ' + attributs[2] + ' ' + attributs[3] + ' ' + attributs[4] + ' ' + attributs[5];
                    a.satcoord.Longitude = Convert.ToDouble(attributs[6]);
                    a.satcoord.Latitude = Convert.ToDouble(attributs[7]);
                    liste.Add(a);
                    }
                return liste;
            }
    Lors de l’exécution dans l'émulateur, j'ai une erreur "NullReferenceException". Très troublant d'autant que dans les variables locales on voit toujours que attribut[6]="5,56666" et attribut[7]="43,3935"

    Je viens de tester en changeant attribut[6] par "4.5" et "4,5" dans le premier cas j'ai "FormatExecption" et le second "NullReferenceException" le problème viens donc bien de cette fonction mais je ne parviens pas à l'identifier.

    Merci pour votre aide !



    mardi 11 décembre 2012 09:35
  • Finalement je viens de redéfinir le problème, en séparant mes instructions j'ai constaté que le problème venais de la modification des coordonnées satelites de mon objet Parking.

    Classe Loader pour charger la Base de donnée

    {
                List<Parking> liste = new List<Parking>();
                //crée une nouvelle liste de parking
                
                //Défini la culture comme étant Française car ma BDD contient des ','
                var ressource = App.GetResourceStream(new Uri("Data/Parkings.txt", UriKind.RelativeOrAbsolute));
                StreamReader bddparking = new StreamReader(ressource.Stream);
                string ligne;
                while ((ligne = bddparking.ReadLine()) != null)
                {
                    string[] attributs = ligne.Split(';');
                    Parking a = new Parking();
                    a.nom = attributs[0];
                    a.adresse = attributs[1] + ' ' + attributs[2] + ' ' + attributs[3] + ' ' + attributs[4] + ' ' + attributs[5];
                    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
                    Double longitude = Convert.ToDouble(attributs[6]);
                    Double latitude = Convert.ToDouble(attributs[7]);
                    a.setcoord(longitude, latitude);
                    liste.Add(a);
                    }
                return liste;
            }

    Classe Parking

    public class Parking
        {
            public System.Device.Location.GeoCoordinate satcoord { set; get; }
            public string adresse { set; get; }
            public string nom { set; get; }
    
            public void affiche() 
            {
            String Park = this.nom + " au : "+this.adresse;
            Console.Write(Park);
            }
            public void setcoord(Double longitude, Double latitude )
            {
                this.satcoord.Latitude = latitude;
                this.satcoord.Longitude = longitude;
            }
        }

    La NullReferenceException interviens au niveau de ma classe Parking au niveau de ma fonction changeant les coordonnées.


    mardi 11 décembre 2012 10:09
  • Problème résolu !
    Grâce à vos suggestion j'ai remarqué que le problème ne venait pas de la fonction convert mais de ma classe parking et plus particulièrement de ma gestion des coordonnées satellite. J'ai donc créer une méthode qui me permet de les redéfinir proprement par étape et cela fonctionne.
    Voici le code :
    Loader :

    public class Loader
        {
            public static List<Parking> getbddparking()
            {
                List<Parking> liste = new List<Parking>();
                //crée une nouvelle liste de parking
                
                //Défini la culture comme étant Française car ma BDD contient des ','
                var ressource = App.GetResourceStream(new Uri("Data/Parkings.txt", UriKind.RelativeOrAbsolute));
                StreamReader bddparking = new StreamReader(ressource.Stream);
                string ligne;
                while ((ligne = bddparking.ReadLine()) != null)
                {
                    string[] attributs = ligne.Split(';');
                    Parking a = new Parking();
                    a.nom = attributs[0];
                    a.adresse = attributs[1] + ' ' + attributs[2] + ' ' + attributs[3] + ' ' + attributs[4] + ' ' + attributs[5];
                    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
                    Double longitude = Convert.ToDouble(attributs[6]);
                    Double latitude = Convert.ToDouble(attributs[7]);
                    a.setcoord(longitude, latitude);
                    liste.Add(a);
                    }
                return liste;
            }
    
        }

    Classe Parking :

    public class Parking
        {
            public System.Device.Location.GeoCoordinate satcoord { set; get; }
            public string adresse { set; get; }
            public string nom { set; get; }
    
            public string affiche() 
            {
            String Park = this.nom + " au : "+this.adresse;
            return Park;
            }
            public void setcoord(Double longitude, Double latitude )
            {
                System.Device.Location.GeoCoordinate coord = new System.Device.Location.GeoCoordinate(longitude, latitude);
                this.satcoord = coord;
            }
        }

    mardi 11 décembre 2012 10:24