babe59
Messages postés189Date d'inscriptionvendredi 28 mai 2004StatutMembreDernière intervention27 novembre 2015
-
3 juil. 2007 à 13:50
babe59
Messages postés189Date d'inscriptionvendredi 28 mai 2004StatutMembreDernière intervention27 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());
babe59
Messages postés189Date d'inscriptionvendredi 28 mai 2004StatutMembreDernière intervention27 novembre 2015 3 juil. 2007 à 16:00
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 3 juil. 2007 à 16:27
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"));
babe59
Messages postés189Date d'inscriptionvendredi 28 mai 2004StatutMembreDernière intervention27 novembre 2015 3 juil. 2007 à 16:42
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à !
babe59
Messages postés189Date d'inscriptionvendredi 28 mai 2004StatutMembreDernière intervention27 novembre 2015 3 juil. 2007 à 17:39
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)
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 3 juil. 2007 à 18:03
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).
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 3 juil. 2007 à 22:17
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....
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 4 juil. 2007 à 10:45
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)
babe59
Messages postés189Date d'inscriptionvendredi 28 mai 2004StatutMembreDernière intervention27 novembre 2015 4 juil. 2007 à 11:20
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 ...
SharpMao
Messages postés1024Date d'inscriptionmardi 4 février 2003StatutMembreDernière intervention 7 juin 201069 4 juil. 2007 à 11:29
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)
babe59
Messages postés189Date d'inscriptionvendredi 28 mai 2004StatutMembreDernière intervention27 novembre 2015 4 juil. 2007 à 11:41
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 += ");";