Séparateur de décimal [Résolu]

Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Dernière intervention
27 novembre 2015
- - Dernière réponse : babe59
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Dernière intervention
27 novembre 2015
- 10 juil. 2007 à 11:07
Bonjour,

Je dois faire une appli qui tourne sur des postes ayant le séparateur de décimal à '.' ou à ','. J'aimerai donc modifier la méthode ToString afn qu'elle remplace le point ou la virgule en fonction du séparateur défini dans les options régionnales. Pourriez vous m'aider pour modifier cette méthode pour un dataRow par exemple (la récup du séparateur et le replace ne me pose pas de soucis, c'est plutot la réécriture du ToString).

Exemple :
double epais = double.Parse(dr["EPAIS"].ToString());

Merci

DT
Afficher la suite 

Votre réponse

20/23 réponses

Meilleure réponse
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
3
Merci
Alors, non, ceci n'est pas une requête paramétrée.

Je vais essayer de faire un petit tutorial pour expliquer l'utilisation des requêtes paramétrées, je te tiens au courant.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 95 internautes nous ont dit merci ce mois-ci

Commenter la réponse de SharpMao
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
3
Merci
Tuto déjà existant et tout frais :
http://www.csharpfr.com/tutoriaux/UTILISATION-REQUETES-PARAMETREES-AVEC-ADO-NET_709.aspx

<hr />
-Blog-

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 95 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_Bidou
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Salut,
Tu peux récupérer le separator courant comme ceci:

System.Globalization.
CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator

<hr />
-Blog-
Commenter la réponse de cs_Bidou
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Dernière intervention
27 novembre 2015
0
Merci
j'ai du mal m'exprimer... Pas de soucis pour le séparator...

c'est plus l'override de la méthode TosString qui me pose problème.

Pour reprendre mon exemple: double epais = double.Parse(dr["EPAIS"].ToString());
si EPAIS = "12,2" dans une colonne d'une base SQL, j'aimerai que la méthode ToString de ma DataRow me retourne "12.2"

DT
Commenter la réponse de babe59
Messages postés
29
Date d'inscription
mercredi 21 mars 2007
Dernière intervention
9 septembre 2008
0
Merci
tu peux essayer ça !!!!!
double epais = double.Parse(dr["EPAIS"].ToString().Replace(',','.'));
Commenter la réponse de djamelbarache
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Tu peux passer un IFormatProvider à ToString.
Tu peux donc lui spécifier une culture différente pour qu'il formate les données selon cette culture. Par exemple:

string x = myDoubleToString(
new System.Globalization.
CultureInfo(
"fr-CH"));

<hr />
-Blog-
Commenter la réponse de cs_Bidou
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Dernière intervention
27 novembre 2015
0
Merci
 1012116 djamelbarache : je n'ai pas envie de rajouter le replace à mon tostring, je préférerez  que ca soit le toString qui fasse le travail

=13319 Bidou : OK, mais dans mon cas, la virgule ne dépend pas de la culture mais d'un choix d'utilisateur dans les options régionnales. En fait elle peut changer d'un PC à l'autre pour la même culture.

Voici la méthode toString de mon DataRow que j'aimerai implémenter (c'est juste une idée, je ne sais pas l'intégrer à mon code)

publicoverridestring ToString()
{
string goodSeparator = NumberFormatInfo.CurrentInfo.NumberDecimalSeparatorstring badSeparator goodSeparator "." ? "," : "."
returnbase.ToString().Replace(badSeparator, goodSeparator);
}qq chose dans ce gout là !

DT
Commenter la réponse de babe59
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Dernière intervention
27 novembre 2015
0
Merci
je pose la question différemment :

puis je ajouter une méthode _ToString à un objet existant tel qu'un DataRow

--------
DataRow dr = null;
...
string str = dr["TOTO"]._ToString();
---------

DT
Commenter la réponse de babe59
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
dr[x] retourne un object.
Donc le ToString se fera sur l'object et pas le dataRow.

Tu peux faire un override en dérivant la class sur laquelle tu veux modifier le ToString. Possible seulement pour les objects non-sealed donc.

<hr />
-Blog-
Commenter la réponse de cs_Bidou
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Dernière intervention
27 novembre 2015
0
Merci
Ok pour le type de retour du DataRow,
Ok pour l'override de la classe "object" (si j'ai bien compris) mais comment l'implémenter dans mon source ... ?
la classe object est elle "non-sealed" ?

Et pour ma dernière question (ajout d'un nouvelle méthode à la classe DataRow) As tu une idée (c'est pour moi un autre moyen de régler mon problème)

DT
Commenter la réponse de babe59
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Tu vas être embêté avec le DataRow parce que son constructeur est protected internal.
Tu peux donc pas l'instancié directement... (éven. par reflexion, mais c'est pas pour autant que tu pourras dérivé la classe).

Pour le type object, oui tu peux le dérivé, mais c'est pas si simple.
Parce que même si dr[x] return un object, c'est la méthode du type de base qui sera appelé (late binding inside).

<hr />
-Blog-
Commenter la réponse de cs_Bidou
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Dernière intervention
27 novembre 2015
0
Merci
Dommage,
merci pour l'interêt que tu as porté à mon problème. je vais faire des replace à chaque ToString concerné...

DT
Commenter la réponse de babe59
Messages postés
5507
Date d'inscription
dimanche 4 août 2002
Dernière intervention
20 juin 2013
0
Merci
Je ne vois pas trop d'autres solution.
Eventuellement, tu peux créer une nouvelle classe, et c'est ces objects que tu stockeras dans ton datatable. Du coup quand tu vas les récupérer, tu pourras les caster dans ce type et appeler une méthode que tu as implémentée pour avoir la sortie (affichage) nécessaire....

<hr />
-Blog-
Commenter la réponse de cs_Bidou
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
0
Merci
Hello,

Juste une question, ton champs EPAIS dans la DB, est-il de type string ou double ?

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Dernière intervention
27 novembre 2015
0
Merci
j'ai les deux cas (string et double)

Pour info : je gère des string lorsque je veux mémoriser la précision (ex "12.2" n'a pas la même précision que "12.22")

DT
Commenter la réponse de babe59
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
0
Merci
Hello,

A ta place, je mettrais tout en double, et je gérerais la précision avec un Math.Round, auquel tu peux paser le nombre de digit désiré.
De cette manière, tout est en double dans la DB, et pas de problème d'affichage, puisque le ToString prendra par défaut la culture local du PC.

Par contre, si tu ne veux pas arrondir (1.26 -> 1.3), mais tronquer (1.26 -> 1.2), il te faudra peut-être faire une petit méthode toi-même.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Dernière intervention
27 novembre 2015
0
Merci
le problème est un peu plus compliqué :
   1°- C'est l'utilisateur qui défini la précision qu'il veut apporté à un chiffre grâce à la saisie des digits après la virgule. Lorsqu'il saisie 12,2 il veut une précision à 1 chiffre donc 12,2 12,29 12,20 = 12,21 ...
Donc 12,20 n'a pas la même précision que 12,2. Si je mémorise ces données en double, je devrais mémorisé un zone supplémentaire indiquant le nombre de digits apres la virgule à prendre en compte...

2°   - les masks de saisie et les numericUpDown me posent aussi des soucis puisqu'en cas de ',' dans les options régionales, le point du pavé numérique n'est pas autorisé. il faut donc chercher la virgule sur le clavier en cas de saisie de chiffre, pas génial

3° - les requetes SQL ne supportent pas les chiffres à virgules, SQL considère la zone 12,22 comme une valeur 12 et une valeur 22. Ex la requete suivante génére une erreur : 
UPDATE    
      TBL_TABLE
SET              
      EPAIS = 12,12
WHERE     (PK_T = 12)

En conclusion, je suis en train de mettre de .Replace un peu partout ...

DT
Commenter la réponse de babe59
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
0
Merci
Hello,

C'est vrai que ton problème est un peu compliqué, et que la manière la plus simple de s'en sortir est peut-être de faire des Replace, même si j'essaie d'éviter de mettre des string quand on pourrait travailler avec des nombres (j'ai toujours été plus scientifique que littéraire )
Par contre, une petite remarque concernant ton point 3. Si tu utilise des requêtes paramétrées, tu n'aurais pas ce genre de problèmes.

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
Messages postés
189
Date d'inscription
vendredi 28 mai 2004
Dernière intervention
27 novembre 2015
0
Merci
Pour le point 3 : j'utilise des requêtes paramétrées (si on parle bien de la même chose) mais en fait, je construit ma requete INSERT ou UPDATE dynamiquement à partir d'une structure dont la valeur de la colonne est un un variable de type "object" (ce qui me permet de passer tout type de donnée) et avec ce principe, je dois initialiser la valeur (dans la structure) avec un replace

Exemple
string sqlQuery = "INSERT INTO TBL_TEMOIN (";
//Nom des colonnes
for (int i = 0; i < champs.Count; i++)
{
      sqlQuery += ((T_Champs)champs[i]).column;
      if (i < champs.Count - 1) sqlQuery += ", ";
}

sqlQuery += ") VALUES (";

//Valeur des colonnes
for (int i = 0; i < champs.Count; i++)
{
      if (((T_Champs)champs[i]).isString) sqlQuery += "'";
      sqlQuery += ((T_Champs)champs[i]).value;
      if (((T_Champs)champs[i]).isString) sqlQuery += "'";
      if (i < champs.Count - 1) sqlQuery += ", "
}
sqlQuery += ");";

...

DT
Commenter la réponse de babe59
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
0
Merci
Et voici le tutorial promis :

http://www.csharpfr.com/tutorial.aspx?ID=710

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao

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.