Bonjour,
J'ai un soucis très particulier avec le to_number.
Le système sur lequel je travaille est sur une base Oracle. Le séparateur de décimal est le point, il en a toujours été ainsi.
Donc les postes dev, utilisateurs et les serveurs sont configurés pour mettre le point.
to_number('1.3') a toujours renvoyé 1.3 et to_number('1,3') a toujours renvoyé ORA-01722.
D'autre part, on utilise une fonction maison "isnumeric" qui fait un to_number, qui renvoie 1 si ok et 0 sinon. Pareil, ça a toujours fonctionné.
Il y a des résultats dans une table sous forme de varchar2. En général, il y a un nombre avec un point. Et régulièrement, il y a besoin de convertir cette valeur en décimal.
PL/SQL, programmes en delphi, c#, crystal report, tout se passe bien, sauf dans 1 cas où un programme en c# n'obtient pas la donnée convertie.
Exemple : j'ai '9.16'. que ce soit sur sql developper ou sql plus, to_number('9.16') renvoie 9.16.
Or, quand je passe en debug en c#, je n'ai pas de valeur convertit, et si je rajoute un isnumeric('9.16'), cela renvoie 0.
J'ai eu une idée. Dans ma fonction qui renvoie le résultat numérique final en partant du varchar2, je fais :
Et là, la fonction marche très bien partout.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 -- xValeur et yValeur_transformee sont des varchar2 if isnumeric(xValeur) = 0 then yValeur_transformee := replace(xValeur, '.', ','); else yValeur_transformee := xValeur; end if;
Mais je trouve ça pourri comme "patch".
Quelqu'un a-t-il été confronté à ce problème ? Y a-t-il une manière plus "propre" de contourner ce problème ?
Merci![]()
Partager