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

babe59 189 Messages postés vendredi 28 mai 2004Date d'inscription 27 novembre 2015 Dernière intervention - 3 juil. 2007 à 13:50 - Dernière réponse : babe59 189 Messages postés vendredi 28 mai 2004Date d'inscription 27 novembre 2015 Dernière intervention
- 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 

23 réponses

Répondre au sujet
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 4 juil. 2007 à 12:12
+3
Utile
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)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de SharpMao
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 4 juil. 2007 à 12:20
+3
Utile
Tuto déjà existant et tout frais :
http://www.csharpfr.com/tutoriaux/UTILISATION-REQUETES-PARAMETREES-AVEC-ADO-NET_709.aspx

<hr />
-Blog-
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 3 juil. 2007 à 14:22
0
Utile
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
babe59 189 Messages postés vendredi 28 mai 2004Date d'inscription 27 novembre 2015 Dernière intervention - 3 juil. 2007 à 16:00
0
Utile
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
djamelbarache 29 Messages postés mercredi 21 mars 2007Date d'inscription 9 septembre 2008 Dernière intervention - 3 juil. 2007 à 16:26
0
Utile
tu peux essayer ça !!!!!
double epais = double.Parse(dr["EPAIS"].ToString().Replace(',','.'));
Commenter la réponse de djamelbarache
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 3 juil. 2007 à 16:27
0
Utile
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
babe59 189 Messages postés vendredi 28 mai 2004Date d'inscription 27 novembre 2015 Dernière intervention - 3 juil. 2007 à 16:42
0
Utile
 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
babe59 189 Messages postés vendredi 28 mai 2004Date d'inscription 27 novembre 2015 Dernière intervention - 3 juil. 2007 à 16:50
0
Utile
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 3 juil. 2007 à 17:07
0
Utile
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
babe59 189 Messages postés vendredi 28 mai 2004Date d'inscription 27 novembre 2015 Dernière intervention - 3 juil. 2007 à 17:39
0
Utile
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 3 juil. 2007 à 18:03
0
Utile
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
babe59 189 Messages postés vendredi 28 mai 2004Date d'inscription 27 novembre 2015 Dernière intervention - 3 juil. 2007 à 18:10
0
Utile
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
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 3 juil. 2007 à 22:17
0
Utile
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
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 4 juil. 2007 à 08:53
0
Utile
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
babe59 189 Messages postés vendredi 28 mai 2004Date d'inscription 27 novembre 2015 Dernière intervention - 4 juil. 2007 à 10:23
0
Utile
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
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 4 juil. 2007 à 10:45
0
Utile
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
babe59 189 Messages postés vendredi 28 mai 2004Date d'inscription 27 novembre 2015 Dernière intervention - 4 juil. 2007 à 11:20
0
Utile
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
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 4 juil. 2007 à 11:29
0
Utile
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
babe59 189 Messages postés vendredi 28 mai 2004Date d'inscription 27 novembre 2015 Dernière intervention - 4 juil. 2007 à 11:41
0
Utile
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
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 4 juil. 2007 à 13:09
0
Utile
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.

séparateur de décimal - page 2