none
utilisation du type money RRS feed

  • Question

  • bonjour,

    dasn la definition de ma base de donnees, pour ma table Test , j ai un champ Montant de type money.

    a partir de mon application , lorsque je recupere la valeur de ce champ, j obtiens par exemple

    Montant = 26000,000 que je mets dans le champ textbox0  de mon formulaire.

    ce qui est normal.

    Or je voudrais comparer cette valeur avec celle saisie par l operateur par exemple 15000 contenu dans le champ Textbox1 de mon formulaire.

    mais quand j ecris int.parse(textbox0.text), j ai une erreur de type string incorrect lors de l execution.

    comment donc recuperer ma valeur money sans la virgule (26000 eu lieu de 26000,000)

    Merci


    Marcelle NGOUNOU

    samedi 5 mai 2012 02:26

Réponses

  • Bonjour,

    Ce qui est normal, la virgule n'étant pas valide pour un "int". Faire plutôt un Decimal.Parse (ou Decimal.TryParse si la saisie est susceptible de ne pas être valide), Decimal car Double privilégie l'étendue des valeurs possibles au détriment de la précision ce qui peut causer plus facilement des problèmes d'arrondis dans les calculs financiers.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse marclas dimanche 6 mai 2012 03:48
    samedi 5 mai 2012 12:04
    Modérateur

Toutes les réponses

  • Bonjour,

    Je ne pense pas qu'il faut partir vers la comparaison sans la virgule mais plutôt de convertir correctement les type string en double par exemple. Moi j'ai fait cette méthode qui marche dans toutes les cultures :

    public static double RetourneDouble(string monstring)
            {
                try
                {
                    NumberFormatInfo nfi = NumberFormatInfo.CurrentInfo;
                    string dVal = "";
                    dVal = monstring.Replace(",", nfi.NumberDecimalSeparator).Replace(".", nfi.NumberDecimalSeparator);
                    return Double.Parse(dVal);
                }
                catch
                {
                    return 0;
                }
            }

    Et j'en sors un type double. Je l'utilise comme ça :

    double A = class1.RetourneDouble(txtA.Text.ToString());

    et j'ai aucun problème.

    si ça peut t'aider...

    Christophe

    samedi 5 mai 2012 08:33
  • Bonjour,

    Ce qui est normal, la virgule n'étant pas valide pour un "int". Faire plutôt un Decimal.Parse (ou Decimal.TryParse si la saisie est susceptible de ne pas être valide), Decimal car Double privilégie l'étendue des valeurs possibles au détriment de la précision ce qui peut causer plus facilement des problèmes d'arrondis dans les calculs financiers.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    • Marqué comme réponse marclas dimanche 6 mai 2012 03:48
    samedi 5 mai 2012 12:04
    Modérateur
  • Bonjour,

    A ma connaissance Double.Parse prends déjà en compte la culture. En anglais US, la virgule est le séparateur de milliers. Je trouve également un peu dangereux de retourner 0 en cas d'erreur (Double.TryParse permet de tester si la valeur est valide).

    Par exemple :

            static void Test()
            {
                Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture.DisplayName);
                Console.WriteLine(Double.Parse("1,234"));
            }
            static void Main()
            {
                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-us");
                Test();
                System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("fr-fr");
                Test();
                Console.ReadLine();
            }
    Retourne bien 1234 en anglais US et 1,234 en français.

    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".



    samedi 5 mai 2012 12:11
    Modérateur
  • Bonjour Patrice,

    Vous (tu..) avez raison sur le fait de retourner 0 en cas d'erreur. Mais ma petite fonction n'est pas si mauvaise que cela pour transformer une chaine d'une TextBox en double. Par exemple, en culture française, si un utisateur saisi "15.2" :

    string montextbox = "15.2";
    double valeur = double.parse(montextbox);

    Une exception est tout de même levée à cause du point.

    J'ai eu le cas sur WP, le clavier en InputScore="Number" c'est le point qui est mis par défaut alors qu'en France, notre séparateur est la virgule.

    Et il n'y a pas que sur Windows Phone que le point est mis comme séparateur de décimal en France.





    mardi 8 mai 2012 07:14