Convertir un string en décimal (C#) [Résolu]

Gwendo69 146 Messages postés lundi 29 septembre 2008Date d'inscription 28 juin 2013 Dernière intervention - 16 juin 2009 à 10:51 - Dernière réponse : Gwendo69 146 Messages postés lundi 29 septembre 2008Date d'inscription 28 juin 2013 Dernière intervention
- 16 juin 2009 à 16:00
Bonjour,

j'ai un formulaire avec des zones de texte. J'ai besoin de convertir les valeurs inscrites dedans en décimal pour pouvoir les insérer dans ma base de données.
J'ai essayé avec Convert.ToDecimal, rien à faire ça ne marche pas.

Du coup j'ai utilisé "Parse" avec using System.Globalization. Voici le code:

decimal carb = decimal.Parse(txt_Carburant.Text, System.Globalization.CultureInfo.InvariantCulture);
decimal pea = decimal.Parse(txt_Peage.Text, System.Globalization.CultureInfo.InvariantCulture);
decimal loc = decimal.Parse(txt_location.Text, System.Globalization.CultureInfo.InvariantCulture);

//TRAVAIL SUR LA BASE
SqlCommand insert = new SqlCommand("INSERT INTO frais
(carburant,nb_litre,peage_autoroute,km_mois,cout_location,mois,numero_immatriculation)
VALUES ('" + carb + "', '" + txt_NbLitres.Text + "','" + pea + "','" + txt_KmMois.Text + "','" + loc + "','" + cbx_mois.Text + "','" + cbx_NumeroImmat.Text + "')", cnxsql.MyConnection);
insert.ExecuteNonQuery();

Les données s'insèrent bien dans la table, mais la virgule est "oubliée". Quand je met 1,23 j'ai 123 dans la table.

Est-ce que quelqu'un sait pourqoi et si il y a une autre solution? Merci d'avance.

Gwendo.
Afficher la suite 

10 réponses

Répondre au sujet
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 16 juin 2009 à 15:29
+3
Utile
La culture, c'est la différence de format selon les pays.

En France, un nombre à "virgule" s'écrit 12,3. En Angleterre, il s'écrira 12.3.
En France, une on écrit les dates ainsi : 31/12/2009. En Angleterre (pas sûr à 100% de moi) 12-31-2009.

Donc la conversion vers/depuis un string dépend de la culture.

Quant au fait que des nombres soient arrondis dans ta base de données, la seule raison que je vois est que des champs "décimaux" dans ta base ont une précision de 0 chiffre après la virgule ;-)
Il te faut donc modifier le type / la précision des champs de ta base de données.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de krimog
Gwendo69 146 Messages postés lundi 29 septembre 2008Date d'inscription 28 juin 2013 Dernière intervention - 16 juin 2009 à 16:00
+3
Utile
MERCI! MERCI! MERCI!

ça marche enfin. Les lignes de code ne génèrent plus aucune erreur et en mettant l'échelle à deux (je n'avais pas vu, elle était à 0), les chiffres après la virgule sont pris en compte. En plus, j'aurais appris ce qu'est une culture.

Merci beaucoup.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Gwendo69
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 16 juin 2009 à 11:12
0
Utile
quand tu dis que Convert.ToDecimal() ne fonctionne pas, qu'est-ce qui se passe ?

Quand à ta requête SQL, utilise des requêtes paramétrées, il va gérer tout seul les types :
commande.CommandText "INSERT INTO Table SET monChamp @MonParam WHERE monChamp2 = @monParam2";
commande.Parameters.Add(new SqlParameter("@MonParam", maVariable));
commande.Parameters.Add(new SqlParameter("@MonParam2", maVariable2));

Avec cette méthode, ça fonctionne que maVariable et maVariable2 soient des string, int, DateTime, bool, decimal...

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Commenter la réponse de krimog
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 16 juin 2009 à 11:16
0
Utile
Enfin, bien sûr, il faut que le type de maVariable corresponde au type de monChamp et que maVariable2 corresponde au type de monChamp2.
Mais l'avantage, c'est que tu n'as pas à te soucier de mettre des ' ou non, il s'en chargera.

Ah, et je me suis planté dans ma requête, j'ai confondu l'INSERT avec l'UPDATE (désolé :) )
INSERT INTO Table (monChamp, monChamp2) VALUES (@MonParam, @MonParam2);

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Commenter la réponse de krimog
Gwendo69 146 Messages postés lundi 29 septembre 2008Date d'inscription 28 juin 2013 Dernière intervention - 16 juin 2009 à 11:55
0
Utile
Bonjour,

Merci de prendre le temps de regarder ça.

Lorsque j'utilise "decimal carb = Convert.ToDecimal(txt_Carburant.Text);"
j'ai cette erreur: "Erreur de conversion du type de données varchar en numeric."
Sinon, j'ai vérifier dans ma table, les champs sont bien en decimal.

Je vais essayer ta méthode même si j'ai pas tout compris.
Commenter la réponse de Gwendo69
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 16 juin 2009 à 12:06
0
Utile
"Erreur de conversion du type de données varchar en numeric." c'est parce que tu mets des ' autour de ta valeur dans ta requête je pense.

Mais utilise les requêtes paramétrées, comme je t'ai dit. C'est très simple : tu insères @UnNomAuChoix dans ta requête (sans ', ni #, ni rien), puis tu fais commande.Parameters.Add(new SqlParameter(leNomQueTuAsDonne /* en l'occurrence "@UnNomAuChoix" */, laValeur));

Et lors de l'exécution de ta requête, il s'occupera automatiquement du formatage de ton paramètre dans ta requête, selon le type de laValeur.

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Commenter la réponse de krimog
Gwendo69 146 Messages postés lundi 29 septembre 2008Date d'inscription 28 juin 2013 Dernière intervention - 16 juin 2009 à 12:56
0
Utile
Ah! ça m'énerve. Désolée de déranger encore mais à mon avis j'ai ENCORE fait une erreur. Puisque ça ne me renvoie que les valeurs avant la virgule.

Mon code:
SqlCommand insert = new SqlCommand ("INSERT INTO frais(carburant,nb_litre,peage_autoroute,km_mois,cout_location,mois,numero_immatriculation)
VALUES (@carburant, '" + txt_NbLitres.Text + "',@peage,'" + txt_KmMois.Text + "',@location,'" + cbx_mois.Text + "','" + cbx_NumeroImmat.Text + "')", cnxsql.MyConnection);

insert.Parameters.Add(new SqlParameter("@carburant", SqlDbType.Decimal));
insert.Parameters.Add(new SqlParameter("@peage", SqlDbType.Decimal));
insert.Parameters.Add(new SqlParameter("@location", SqlDbType.Decimal));

insert.Parameters["@carburant"].Value = txt_Carburant.Text;
insert.Parameters["@peage"].Value = txt_Peage.Text;
insert.Parameters["@location"].Value = txt_location.Text;

insert.ExecuteNonQuery();

Peut-être que tu sais pourquoi, tu as l'air de t'y connaitre bien mieux que moi.
Commenter la réponse de Gwendo69
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 16 juin 2009 à 13:43
0
Utile
Salut,

Tu devrais mettre tous tes paramètres sous forme de paramètres.
pas de ' pour les numeriques

Mais en passant par les requetes paramétrées pour tous les paramétres tu n'auras plus le problème.

Pour le convertto as-tu regardé la culture employée
travailles-tu en . ou en ,

Il y a un Decimal.Parse Method qui accepte les cultures il me semble.
Commenter la réponse de nhervagault
krimog 1863 Messages postés lundi 28 novembre 2005Date d'inscription 14 février 2015 Dernière intervention - 16 juin 2009 à 14:13
0
Utile
insert.Parameters.Add(new SqlParameter("@carburant", SqlDbType.Decimal));

insert.Parameters["@carburant"].Value = txt_Carburant.Text;

=>

insert.Parameters.Add(new SqlParameter("@carburant", Convert.ToDecimal(txt_Carburant.Text.Replace('.', ','))));

essaie comme ça. Et comme le dit nhervagault, utilise une requête paramétrée pour TOUS tes paramètres

Krimog : while (!(succeed = try())) ;
- NON, "LE BAR" n'est PAS un langage de programmation ! -
Commenter la réponse de krimog
Gwendo69 146 Messages postés lundi 29 septembre 2008Date d'inscription 28 juin 2013 Dernière intervention - 16 juin 2009 à 15:00
0
Utile
Merci pour vos réponses.
Mais en regardant bien, j'ai l'impression que ça arrondi le nombre sans prendre en compte les chiffres après la virgule. Quand j'ai 12,3 ça marque 12 et si je met 12,98 ça met 13. Le problème viendrait de là? En tout cas y a plus de message d'erreur.

Au final j'ai ça:
SqlCommand insert = new SqlCommand ("INSERT INTO frais(carburant,nb_litre,peage_autoroute,km_mois,cout_location,mois,numero_immatriculation)
VALUES (@carburant,@litres,@peage,@km,@location,@mois,@immat)", cnxsql.MyConnection);

insert.Parameters.Add(new SqlParameter("@carburant", Convert.ToDecimal(txt_Carburant.Text.Replace('.', ','))));
insert.Parameters.Add(new SqlParameter("@litres", Convert.ToInt32(txt_NbLitres.Text)));
insert.Parameters.Add(new SqlParameter("@peage", Convert.ToDecimal(txt_Peage.Text.Replace('.', ','))));
insert.Parameters.Add(new SqlParameter("@km", Convert.ToInt32(txt_KmMois.Text)));
insert.Parameters.Add(new SqlParameter("@location", Convert.ToDecimal(txt_location.Text.Replace('.', ','))));
insert.Parameters.Add(new SqlParameter("@mois", Convert.ToString(cbx_mois.Text)));
insert.Parameters.Add(new SqlParameter("@immat", Convert.ToString(cbx_NumeroImmat.Text)));

PS: c'est quoi ces histoire de cultures? Je sais pas ce que c'est.
Commenter la réponse de Gwendo69

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.