NumberFormat et DecimalSeparator

Signaler
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
-
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
-
Bonjour a tous.

Voila, j'ai un petit probleme dans mon appli d'exportation de données de SQL Server a postgreSQL lorsque j'ai des 'decimal'.
En effet, postgres n'accepte pas la ',' et je n'arrive pas à lui dire d'utiliser un point pour la conversion en string. Est-ce qu'il y a un moyen de changer ce DecimalSeparator sans spécifier une nouvelle CultureInfo? Parce que la fonction qui recupere la string en fonction des données d'une table sert aussi à d'autres moments, ou je n'ai pas besoin de CultureInfo différente.

En espérant avoir été assez clair,
Merci d'avance.
Ordinastie
A voir également:

6 réponses

Messages postés
318
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
30 décembre 2005
1
Salut,



Comment fait tu le transfert vers PostGres?

Si tu réalises un traitement (insert) élément par élément, tu peux
remplacer le séparateur décimal avec un bête Replace sur la chaine.

Par exemple :

string strSingle as string;

strSingle = MonSingle.ToString(); //Au choix si tu veux formater

strSingle = strSingle.Replace(",", ".");



Si le programme fait beaucoup de convertion de ce genre, utilises
plutôt le StringBuilder, c'est plus performant pour ce genre
d'opération.



Chris

N'oubliez pas de cloturer votre post.
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
2
J'y avais pensé mais la façon dont j'ai organisé mon appli, je manipule pas la chaine de caractere directement.
Ce qui se passe, c'est que je recup les données de SQL Server dans un datatable (pris d'un dataset), je crée un "mappage" des colonnes sources pour aller dans les colonnes destination genre Addmap("nom_colonne_src", "nom_nouvelle_colonne");
et apres je fais l'export pour chaque DataRow en appelant ma fonction ExecutePgInsertFromDataRow(dr);

Dans cette derniere fonction, j'ai accès au "mappage" des colonnes, et je crée le texte de l'insert pour postgres.
Ce que j'aimerai c'est pouvoir éviter de rajouter le test, ou le replace dans cette fonction car c'est toujours elle qui est appelée pour chaque table, et toutes n'ont pas de 'decimal'.

Dans la meme idée, toutes les informations sur NumberFormat ou CultureInfo sont en lecture seule, donc j'arrive pas à modifier de manière général le comportement. Les solutions que j'ai pu trouver concerne l'instanciation de NumberFormatInfo (de mémoire) et la passer en paramètre de .ToString(). Mais encore une fois, faudrait le faire dans la fonction et je préfère y recourir qu'en dernier recours.

Ordinastie

(Note: j'ai essayé de faire le replace directement a partir de la donnée contenue dans le datarow, mais je peux pas mettre un string alors qu'il attend un decimal. De meme je peux pas changer le type de donnée de la colonne tant qu'elle contient des données, cercle vicieux quoi :s)
Messages postés
318
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
30 décembre 2005
1
Donc, la solution, c'est dans ta méthode de changer de CultureInfo.
Comme toi, j'ai pas réussi. Je pense qu'il faut créer un nouveau Thread
avec le nouveau CultureInfo. Pas évident.

Par contre, dans ta routine, tu peut faire des ToString avec en paramètre un CultureInfo à toi.

Voici un essai fait dans une appli console (en VB et modifié ici, donc y a peut être une coquille):

Single sgl = 1.02;

Console.WriteLine(sgl);

CultureInfo ci = new CultureInfo("fr-FR");

ci.NumberFormat.NumberDecimalSeparator = "-_-";

Console.WriteLine(sgl.ToString(ci));

Console.WriteLine(sgl);

Console.ReadLine();



Dans ton code, ça peut marcher?




Christophe



N'oubliez pas de cloturer votre post.
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
2
Oui, en théorie ca devrait marcher. Maintenant, ca n'est pas aussi évident que ca car le ToString() est le meme pour toutes mes colonnes d'un DataRow
for(i = 0; i < colonne.Count; i++)
valeur = dr[i].ToString();
Et comment je sais pas à l'avance quel type de données la colonne va etre, je peux pas faire tout le temps un
ToString(CultureInfo)

Mais je trouve ca étonnant qu'il soit pas possible de définir que, pour cette application, le DecimalSeparator soit pas celui de la culture par défaut...

Merci de ton aide,
Ordinastie
Messages postés
318
Date d'inscription
jeudi 30 janvier 2003
Statut
Membre
Dernière intervention
30 décembre 2005
1
Tu peux vérifier le type de donnée dans la colonne en cours et faire la convertion qui convient.

Ou bien utiliser la réflexion pour savoir si une surcharge de la
méthode ToString de l'élément à convertir prend en paramètre un
cultureinfo.

Ou sinon (un petit délire ) faire une usine à gaz sans plomb avec la maison, le sapin et les lutins qui ....

Bon plus sérieusement, je pense la première sols est plus facil à
mettre en oeuvre. Autrement, pour appliquer un CultureInfo au process,
je pense que c'est possible de le définir pour un nouveau Thread mais
j'ai pas réussi .



Bon courrage.



Chris


N'oubliez pas de cloturer votre post.
Messages postés
93
Date d'inscription
samedi 29 janvier 2005
Statut
Membre
Dernière intervention
17 octobre 2008
2
Oui, bon, je crois que j'ai pas trop le choix...
Ca me gène un peu de rajouter un test pour 600 lignes d'insertions, alors qu'il va y en avoir 3millions qui en auront pas besoin.
Enfin, merci quand même de t'être penché sur le sujet =)

Bonne journée,
Ordinastie.