Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le format de la chaîne d'entrée est incorrect. C#

probleme variable type double

    18 novembre 2014 à 20:37:00

    Bonjour. Je travaille actuellement sur un projet qui calcule votre impôt.

    J'ai un petit soucis, voici les lignes de code : 

    Projet Main

    double salaireAnnuel = 0;
                do
                {
                    Console.Write("A combien s'élève votre salaire annuel ? ");                
                    salaireAnnuel= double.Parse(Console.ReadLine());
                    if (salaireAnnuel < 0) Console.WriteLine("Erreur, veuillez recommancer !");
                } while (salaireAnnuel < 0);
    
                double revenuImposable = 0;
                revenuImposable = CalculImpotClasse.Class1.coefFamilliale(salaireAnnuel);
    
                Console.ReadKey();
    


    Class

     public static double coefFamilliale(double n)
            {
                double revenuImposable = 0;
                revenuImposable = 0.72 * n;
                Console.WriteLine("Votre revenu imposable s'élève à " + revenuImposable);
                return revenuImposable;
            }


    lorsque je rentre une valeur décimale a salaireAnnuel, j'ai une erreur de ce type (je vous screen le tous)

    http://nsa34.casimages.com/img/2014/11/18/141118083639911908.png

    J'ai essayé le "salaireAnnuel = convert.todouble(console.readline());"

    Mais le même soucis apparaît.

    Je ne comprend pas ce message d'erreur, pourriez vous me guidé ?

    Merci a vous !

    • Partager sur Facebook
    • Partager sur Twitter
      18 novembre 2014 à 21:14:01

      Salut,

      les doubles s'écrive avec une virgule et non un point. Je te conseil de mettre le résultat du Console.ReadLine() dans une variable string et de vérifier si c'est bien un nombre avant de le convertir en double. Tu pourrais aussi remplacer le point par une virgule si tu préfère écrire le nombre avec un point. Un peu comme ça:

                 double salaireAnnuel = 0;
                 string input = "";
                 do
                 {
                     Console.Write("A combien s'élève votre salaire annuel ? ");
                     input = Console.ReadLine().Replace(".", ",");
                     if (!double.TryParse(input, out salaireAnnuel))
                         salaireAnnuel = -1;
      
                     if (salaireAnnuel < 0)
                         Console.WriteLine("Erreur, veuillez recommancer !");
      
                 } while (salaireAnnuel < 0);
      
                 salaireAnnuel = double.Parse(input);



      • Partager sur Facebook
      • Partager sur Twitter
      Bob the programmer from Québec
        19 novembre 2014 à 13:20:15

        En effet le code suivant est parfait :
        Console.ReadLine().Replace(".", ",");

        Mais je ne comprend pas celui ci 

        if (!double.TryParse(input, out salaireAnnuel))

        Car moi d'habitude on m'a appris a faire comme ça

        salaireAnnuel = Convert.ToDouble(Console.ReadLine());

        Peut tu m'expliqué rapidement la différence, peut être que ta méthode est plus avantageuse dans certain cas ?

        • Partager sur Facebook
        • Partager sur Twitter
          19 novembre 2014 à 16:22:33

          Le TryParse retournera un booléen qui indiquera si la conversion s'est effectué et si le format de la chaine d'entré est correct. Si la conversion à marché, le résultat est dans la variable fournie.

          Le Parse lui va retourner le résultat de la conversion et provoquera une exception si le format de la chaine d'entré est incorrect. En fait, le code du TryParse doit ressembler à cela:

          public bool TryParse(string s, out double result)
          {
              try
              {
                  result = double.Parse(s);
                  return true;
              }
              catch (Exception ex)
              {
                  result = double.NaN;
                  return false;
              }
          }

          Le try-catch sert à gérer les exceptions pour que le programme ne plante pas.

          Tu peux utiliser l'une ou l'autre de ces fonctions, mais si tu prends le Parse, tu devra ajouter un bloc try-catch pour que ton programme ne plante pas, c'est ça la différence.

          • Partager sur Facebook
          • Partager sur Twitter
          Bob the programmer from Québec
            21 novembre 2014 à 19:41:00

            D'accord merci bien.

            Je recherche maintenant une façon d’interdire la saisie de caractère car mon Console.ReadLine() doit etre un double.

            Je fairais sa sous la forme d'une fonction dans ma bibli de classe.

            Quelle genre de condition je devrais utilisé ?

            Je m'en vais recherché sur google de ce pas.

            EDIT : 

            J'ai trouvé Char.IsLetter() mais pas pour string .... :/

            Comme le Console.ReadLine() est un string, j'ai une erreur.

            Je recherche aussi une fonction qui supprimerais le nombre de ligne qu'on lui donne

            exemple DeleteLine(3); qui supprimerais les 3 dernières lignes.

            Il faut peut être que je poste un autre sujet ?

            EDIT 2 : Je suis tellement bête, ton try/Catch est capable de faire sa dans la logique, je vais essayé de bidouillé un truc

            (j'aime bien me débrouillé seul et faire un monologue entre question et réponse dans un sujet)

            -
            Edité par sofianeel 21 novembre 2014 à 20:45:41

            • Partager sur Facebook
            • Partager sur Twitter
              21 novembre 2014 à 20:59:49

              En effet le try-catch fonctionnera bien, mais si tu ne veux pas que ton programme crache des exceptions tout le temps, voici une fonction que j'ai fait qui vérifie si un nombre est numérique;

              private const string DecimalDigits = "0123456789";
              public static bool IsNumeric(string num, NumberType numType) 
              {
                  bool passedPoint = false;
              
                  switch(numType)
                  {
                      case NumberType.UnsignedInteger:
                          foreach(char i in num)
                              if (DecimalDigits.Contains(i))
                                  return false;
                                  
                          return true;
              
                      case NumberType.SignedInteger:
                          for (int i = 0; i < num.Length; i++)
                              if (num[i] == '-')
                              {
                                  if (i != 0)
                                      return false;
                              }
                              else if (!DecimalDigits.Contains(num[i]) || (num[i] == '-' && i != 0))
                                  return false;
                                     
                          return true;
                                  
                      case NumberType.UnsignedFloat:
                                  
                          for (int i = 0; i < num.Length; i++)
                              if (num[i] == ',')
                              {
                                  if (i == num.Length - 1 || passedPoint)
                                      return false;
                                          
                                  passedPoint = true;
                              }
                              else if (!DecimalDigits.Contains(num[i]))
                                  return false;
                                      
                          return true;
              
                      case NumberType.SignedFloat:
              
                          for (int i = 0; i < num.Length; i++)
                              if (num[i] == ',')
                              {
                                  if (i == num.Length - 1 || passedPoint)
                                      return false;
              
                                  passedPoint = true;
                              }
                              else if (num[i] == '-')
                              {
                                  if (i != 0)
                                      return false;
                              }
                              else if (!DecimalDigits.Contains(num[i]))
                                  return false;
                                      
                          return true;
                                  
                      default:
                          return false;
              
                  }
              }
              
              public enum NumberType
              {
                  UnsignedInteger,
                  SignedInteger,
                  UnsignedFloat,
                  SignedFloat,
              };

              EDIT : J'ai modifié la fonction parce qu'il y avait une énorme erreur.

              -
              Edité par bob1024 21 novembre 2014 à 21:10:29

              • Partager sur Facebook
              • Partager sur Twitter
              Bob the programmer from Québec
                21 novembre 2014 à 21:18:47

                Bonsoir, merci de ta réponse mais j'ai le regret de t'annoncer que je ne pourrais pas l'utiliser

                Ton code est bien trop complexe et je ne serais capable de le comprendre (je vais l'analysé par curiosité après) mais je développe dans le cadre de mon cours en C#. Je suis supposé utiliser des choses simples puisque je commence a peine.

                Le try/catch fait parti des choses que je peux utiliser car je l'ai recherché, compris et exécuter sans problème (grâce à toi au passage je t'en remercie).

                Mais prendre un code d'un gentil inconnu déjà tous prêt sans savoir le refaire par la suite, c'est pas très judicieux.

                Tous se que je fais actuellement est TOTALEMENT bonus dans mon projet, a la base 3 calculs dans des fonctions et c'est réglé, j'ai juste envie de découvrir certaines techniques, c'est d’ailleurs le but d'un projet a rendre.

                J'espère que tu comprendra ma manière de faire, je fais pas parti des feignasses qui copie/colle un code sans recherché ou savoir refaire. Du moins pas en phase d'apprentissage des bases de la programmation.

                Mais c'est très gentil de ta part.

                Maintenant je recherche un tips pour delete mes dernières lignes écrite. J'ai recherché des pistes sur internet, on parle souvent de code ASCII donc je voudrais quelques indices/pistes/renseignement.

                Comme ça si une erreur est produite, j'ecris sur la console "une erreur s'est produite, recommencez !" et je fais suivre d'un Console.ReadKey() et de ma fonction DeleteLastLine(X) qui supprimerais les X dernières Ligne (Console.WriteLine).

                Autrement existe-t-il des autres manières de faire ?

                • Partager sur Facebook
                • Partager sur Twitter
                  21 novembre 2014 à 21:37:29

                  Pour effacer des lignes dans la console, tu peux déplacer le curseur avec Console.SetCursorPosition. Par exemple, tu écrit du texte dans la console, du déplace la curseur au début de la ligne et tu réécrit du texte par dessus. Voici un exemple:

                  for (int i = 0; i < 100; i++)
                  {
                      Console.SetCursorPosition(0, 0);
                      Console.Write(i + "% ");
                      System.Threading.Thread.Sleep(100);
                  }

                  Le System.Threading.Thread.Sleep sert seulement à mettre un délai (100 millisecondes dans ce cas-ci).

                  Teste ce code et tu verra le résultat.

                  Pour l'autre code, il a peut-être l'air compliqué parce que j'utilise certaines notions que tu ne connais pas, mais le principe est simple: en gros, je fais un foreach sur la chaine fourni et je vérifie si le caractère est un chiffre.

                  -
                  Edité par bob1024 21 novembre 2014 à 21:41:03

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Bob the programmer from Québec
                    22 novembre 2014 à 10:05:48

                    Re-bonjour.

                    Merci de ta contribution encore !

                    Alors ... c'est un bon début de piste déjà.

                    Je dois trouver comment supprimer la ligne d'avant et pas seulement la ligne actuelle.

                    Éventuellement au lieu d'utiliser un console.readkey(), on peux voir cela avec un system.threading.thread.sleep(X)

                    J'ai peut être une idée de comment adapté mon code a ton code (plutôt que le contraire) ce qui mènerais a un résultat semblable.

                    Aller je me met au boulot, on va voir se qu'on peut faire.

                    Notamment une recherche sur comment faire un decompte (je pense pouvoir le faire avec le même bout de code)

                    Ahhhh la programmation, faut avoir des idées de magouille de partout hein.

                    Merci en tous cas, tes bout de code me permette de m'amélioré et ça me fait plaisir !

                    Bonne journée.

                    EDIT : Comme prévu, j'ai réussi a bidouillé un truc !

                    Console.Write("Combien avez vous d'enfant ? "); // Question
                                do // Boucle qui verifie si la valeurs donnée est bien valide, sinon on affiche une erreur et on repose la question
                                {
                                    
                                    try // On try de convertir en Int16 et on genère une erreur si on ne peux pas
                                    {
                                        nombreEnfant = Convert.ToInt16(Console.ReadLine());// On stock le nombre d'enfant dans une variable type entier car on ne peux avoir de demi enfant                
                                    }
                                    catch (Exception) { } // On gère les erreurs diverses               
                                    if (nombreEnfant < 0) // On ne peux pas avoir de valeur négative
                                    {
                                        Console.WriteLine("Erreur, veuillez recommancer ! Patientez.");
                                        //Système pour effacer les lignes entrées et evité d'avoir X ligne d'erreur 
                                        Console.SetCursorPosition(29, 2); // On se place au console.ReadLine()
                                        System.Threading.Thread.Sleep(2000);// pause dans le programme avant d'effacé l'erreur et la reponse erronée
                                        Console.Write("                                                   "); // On efface la ligne 2 qui correspond à la réponse éronnée (nb d'espace en complement a la question pour que sa fasse 1 ligne)                    
                                        Console.SetCursorPosition(0, 3);//On se place au debut de la ligne correspondant a l'affichage de l'erreur
                                        Console.Write("                                         "); // On efface le message d'erreur (nb espace = nb caractère de l'erreur)
                                        Console.SetCursorPosition(29, 2); // On se replace au console.ReadLine() avant la fin de la boucle pour qu'elle se relance correctement
                                    }
                    
                                } while (nombreEnfant < 0); // Fin de boucle        

                    Qu'en pense tu ? c'est une astuce ingénieuse que tu m'a donnée !

                    -
                    Edité par sofianeel 22 novembre 2014 à 10:46:48

                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 novembre 2014 à 16:26:21

                      Oui, c'est très bien, mais au lieu de mettre le curseur en haut de la console, tu pourrai simplement le reculer d'une ligne et d'effacer la ligne:

                      Console.SetCursorPosition(0, Console.CursorTop - 1);  // reculer le curseur d'une ligne
                      Console.Write("                                                  "); // effacer la ligne
                      
                      Console.SetCursorPosition(29, Console.CursorTop - 1);  // reculer le curseur d'une ligne
                      Console.Write("                             "); // effacer la réponse
                      
                      Console.SetCursorPosition(29, Console.CursorTop); // mettre le curseur devant la question

                      La différence est que si tu avais écrit d'autres lignes avant, ça n'aura pas d'influence.

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Bob the programmer from Québec

                      Le format de la chaîne d'entrée est incorrect. C#

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown