Moin,
auch ich hab´ hin- und wieder das Problem, Zeichen in Zahlen umzuwandeln. Daher bietet es sich also an, eine kleine Funktion zu schreiben, die dies übernimmt. Erstmal ein Versuchsaufbau:
CREATE TABLE konvert(
kon\_zahl VARCHAR2(10));
INSERT INTO konvert VALUES
(LPAD('10',10,' '));
INSERT INTO konvert VALUES
(LPAD('1.1',10,' '));
INSERT INTO konvert VALUES
(RPAD('7',10,' '));
INSERT INTO konvert VALUES
(RPAD('3.3',10,' '));
INSERT INTO konvert VALUES
(RPAD('2,7',10,' '));
INSERT INTO konvert VALUES
(LPAD('4,9',10,' '));
INSERT INTO konvert VALUES
('15');
INSERT INTO konvert VALUES
('1,7');
INSERT INTO konvert VALUES
('6.5');
INSERT INTO konvert VALUES
('6.500,00');
INSERT INTO konvert VALUES
(' 4,325.17 ');
INSERT INTO konvert VALUES
(' 6.500,00 ');
INSERT INTO konvert VALUES
(' 5.500 ');
Nun die Funktion:
CREATE OR REPLACE
FUNCTION f\_to\_number(
p\_text IN VARCHAR2 -- eingehender Textstring
,p\_return IN NUMBER DEFAULT -1 -- Rückgabewert bei Fehler
)
RETURN NUMBER IS
v\_wert VARCHAR2(100) :=0;
v\_format VARCHAR2(1) :='';
BEGIN
v\_wert := TRIM(p\_text);
/\* feststellen, ob dt. oder amerik. Format \*/
IF TRIM(TO\_CHAR(1001,'9G990D00')) = '1,001.00' THEN
v\_format := 'A'; -- amerikanisches Format
ELSIF TRIM(TO\_CHAR(1001,'9G990D00')) = '1.001,00' THEN
v\_format := 'D'; -- deutsches Format
ELSE DBMS\_OUTPUT.Put\_Line(SUBSTR('Format nicht erkannt:'|| TO\_CHAR(1001,'9G990D09') ,1,255));
END IF;
/\* -- auf Nachkommastellen prüfen -- \*/
IF v\_format = 'D' THEN
IF v\_wert LIKE '%.\_\_' OR v\_wert LIKE '%.\_' THEN
v\_wert := REPLACE(v\_wert,',',''); -- erst die 1,000´er Trennzeichen entfernen sofern vorhanden
v\_wert := REPLACE(v\_wert,'.',','); -- nun den Dezimalpunkt durch Komma ersetzen
ELSIF v\_wert LIKE '%,\_\_' OR v\_wert LIKE '%,\_' THEN
v\_wert := REPLACE(v\_wert,'.',''); -- erst die 1.000´er Trennzeichen entfernen sofern vorhanden
ELSIF v\_wert LIKE '%,\_\_\_' THEN
v\_wert := REPLACE(v\_wert,',','');
ELSIF v\_wert LIKE '%.\_\_\_' THEN
v\_wert := REPLACE(v\_wert,'.','');
END IF;
ELSIF v\_format = 'A' THEN
IF v\_wert LIKE '%,\_\_' OR v\_wert LIKE '%,\_' THEN
v\_wert := REPLACE(v\_wert,'.',''); -- erst die 1.000´er Trennzeichen entfernen sofern vorhanden
v\_wert := REPLACE(v\_wert,',','.'); -- nun den Dezimalpunkt durch Komma ersetzen
ELSIF v\_wert LIKE '%.\_\_' OR v\_wert LIKE '%.\_' THEN
v\_wert := REPLACE(v\_wert,',',''); -- erst die 1,000´er Trennzeichen entfernen sofern vorhanden
ELSIF v\_wert LIKE '%.\_\_\_' THEN
v\_wert := REPLACE(v\_wert,'.','');
ELSIF v\_wert LIKE '%,\_\_\_' THEN
v\_wert := REPLACE(v\_wert,'.','');
END IF;
END IF;
RETURN TO\_NUMBER(v\_wert);
EXCEPTION
WHEN others THEN
DBMS\_OUTPUT.Put\_Line(SUBSTR(SQLCODE||' - '||SQLERRM,1,255));
DBMS\_OUTPUT.Put\_Line(SUBSTR('Eingangstext: '||p\_text||' Konvertiert bis Fehler: '||v\_wert,1,255));
DBMS\_OUTPUT.Put\_Line(SUBSTR(v\_format ,1,255));
RETURN p\_return;
END;
/
Sollten einem Fehler auffallen oder noch gute Ideen haben, wäre ich für eine kleine Rückmeldung dankbar.
Gruß
Andreas