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

Messages postés
146
Date d'inscription
lundi 29 septembre 2008
Dernière intervention
28 juin 2013
- 16 juin 2009 à 10:51 - Dernière réponse :
Messages postés
146
Date d'inscription
lundi 29 septembre 2008
Dernière intervention
28 juin 2013
- 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 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
- 16 juin 2009 à 15:29
3
Merci
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 ! -

Merci krimog 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de krimog
Meilleure réponse
Messages postés
146
Date d'inscription
lundi 29 septembre 2008
Dernière intervention
28 juin 2013
- 16 juin 2009 à 16:00
3
Merci
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.

Merci Gwendo69 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de Gwendo69
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
- 16 juin 2009 à 11:12
0
Merci
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
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
- 16 juin 2009 à 11:16
0
Merci
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
Messages postés
146
Date d'inscription
lundi 29 septembre 2008
Dernière intervention
28 juin 2013
- 16 juin 2009 à 11:55
0
Merci
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
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
- 16 juin 2009 à 12:06
0
Merci
"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
Messages postés
146
Date d'inscription
lundi 29 septembre 2008
Dernière intervention
28 juin 2013
- 16 juin 2009 à 12:56
0
Merci
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
Messages postés
6069
Date d'inscription
dimanche 13 avril 2003
Dernière intervention
15 juillet 2011
- 16 juin 2009 à 13:43
0
Merci
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
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
- 16 juin 2009 à 14:13
0
Merci
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
Messages postés
146
Date d'inscription
lundi 29 septembre 2008
Dernière intervention
28 juin 2013
- 16 juin 2009 à 15:00
0
Merci
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.