to_number liefert nicht das gewuenschte Ergebnis

Hallo,

ich habe da ein Verständnisproblem mit der to_number-Funktion.
Vielleicht kann mir hier ja jemand auf die Sprünge helfen.

Eigentlich soll nur eine Zahl in druckaufbereiterter Form wie z.B. 1.234,56 in eine Zahl 1234.56 konvertiert werden.
Hierbei kommt es aber zu einem für mich überraschenden Ergebnis:

SELECT  1234.56 val, to_char(1234.56, '99G999D99'), to_number(to_char(1234.56, '99G999D99'),'99G999D99');
   val   |  to_char   | to_number 
---------+------------+-----------
 1234.56 |   1.234,56 |      1.34
(1 row)

SELECT  1234.56 val, to_char(1234.56, '99,999.99'), to_number(to_char(1234.56, '99,999.99'),'99,999.99');
   val   |  to_char   | to_number 
---------+------------+-----------
 1234.56 |   1,234.56 |    134.56
(1 row)

SELECT  1234.56 val, to_char(1234.56, '99999D99'), to_number(to_char(1234.56, '99999D99'),'99999D99');
   val   |  to_char  | to_number 
---------+-----------+-----------
 1234.56 |   1234,56 |   1234.56
(1 row)

Warum funktioniert die Konvertierung nicht in Verbindung mit dem Gruppierungskennzeichen?

Laut Doku sollte es auch mit ‘G’ funktionieren und schon die erste Variante muesste das gewuenschte
Ergebnis liefern.

Was mache ich falsch?


(DB-Details siehe Anhang)

Viele Grüße
Dirk
show_all.txt.zip (6.47 KB)

Frag mich nicht warum, aber der Formatstring muß gleiche Anzahl Stellen haben wie der String, der die Zahl enthält:

test=*# select to_number('1.234,56', '9G999D99');
 to_number
-----------
   1234.56
(1 row)

Hallo,

vielen Dank für die schnelle Antwort!

Allerdings macht mich die Aussage jetzt auch nicht richtig froh.

Da meine Werte in Textform unterschiedliche Stellen vor dem Komma haben ist das
unnötig komplizert. Das würde bedeuten, ich arbeite mit unterschiedlicher Konvertierungsmaske?
Das kann doch nicht sein.

Gibt es hierfür eine elegante Lösung?

VG
Dirk

Na ja, nicht elegant, aber mit der Variante werde ich es mal versuchen:

       ....  to_number('1.234,56',substr('99G999G999D99',14 - length('1.234,56')))

Nochmal vielen Dank für Deinen wertwollen Hinweis.

Was spricht gegen

test=*# select to_number('1.234,56','99999999999999D99');
 to_number
-----------
   1234.56
(1 row)

?

… nichts, nur meine Unkenntnis und die Annahme, dass nach der Erfahrung mit dem ‘G’ so etwas nicht funktioniert.

Ist schon irretierend, dass die Maske ohne G beliebig lang sein kann und mit G genau matchen muss.
Vielleich habe ich aber auch zuviel mit Oracle gemacht und bin dadurch versaut :wink:

Yeah. Ich fand sogar ein Posting meiner ‘Freundin’ Susanne E. zu dem Thema. :wink:

:-))