2016-03-24 4 views
1

Wie kann ich eine Ganzzahl mit Nullen auf der linken Seite (lpad) auffüllen und ein Dezimaltrennzeichen nach dem Dezimaltrennzeichen mit Nullen auf der rechten Seite (rpad) auffüllen.Wie puffert man Nullen für ein Zahlenfeld?

Zum Beispiel: Wenn ich 5,95 habe, möchte ich 00005950 (ohne Trennzeichen) bekommen.

+0

Ist so etwas wie sprintf() auf Ihrer Datenbank? Das wäre der einfachste und lesbarste Weg, dies zu tun. –

+0

Ich glaube nicht – Abderrahim

Antwort

2

Wenn Sie den Wert bis zu Tausendstel, aber nicht mehr von der Dezimalteil wollen, dann können Sie von 1000 und entweder FLOOR oder TRUNC verwenden multiplizieren. Wie folgt aus:

SELECT TO_CHAR(TRUNC(value * 1000), '00000009') 
FROM table_name; 

oder:

SELECT LPAD(TRUNC(value * 1000), 8, '0') 
FROM table_name; 

Mit TO_CHAR wird nur eine eingestellte maximale Anzahl von Ziffern ermöglichen auf der Grundlage der Formatmaske (wenn der Wert über dieser Größe geht, dann wird es # s anzuzeigen statt von Zahlen), aber es wird mit negativen Zahlen umgehen (das Minuszeichen vor den führenden Nullen platzieren).

Die Verwendung von LPAD ermöglicht jede Eingabegröße, aber wenn die Eingabe negativ ist, befindet sich das Minuszeichen in der Mitte der Zeichenfolge (nach allen führenden Nullen).

+0

Ich bevorzuge dieses SELECT LPAD (TRUNC (5.9516 * 1000), 8, 0) VON dual; – Abderrahim

+0

Ich hatte das zu Beginn mit dann aktualisiert es und habe es jetzt mit ein wenig auf die Vor-und Nachteile beider Versionen zurück, wenn Länge der Eingabe und negative Werte zu berücksichtigen. – MT0

+1

Die Formatmaske ergibt ein 9-Zeichen-Ergebnis; Sie haben einen führenden Platz für positive Werte, die Sie mit dem FM-Modifier loswerden könnten; negative Werte sind jedoch immer noch 9 Zeichen. Was natürlich gut ist. (Und Sie haben das Bit über es sowieso immer 8 Zeichen sowieso entfernt!) –

1

Wie wäre Multiplikation und lpad():

select lpad(col * 1000, 8, '0') 
. . . 
+0

Ja hast du Recht, aber das Problem, wenn ich mehr als 3 Ziffern nach dem Dezimaltrennzeichen zum Beispiel 5.9562 habe Ich werde 5956.2 bekommen – Abderrahim

0

Versuchen Sie Folgendes:

select lpad(5.42562 * POWER(10, length(trim(regexp_replace(5.42562, '[^.]+\.(.*)$', '.\1')))-1), 8, '0') from dual; 

wo 5,42562 wäre die Spalte, die Sie wollen.

Also im Grunde verwenden Sie die Antwort von Gordon Linoff, aber multipliziert mit 10 an die Anzahl der Dezimalstellen.

+0

Ich muss nur 3 Ziffern nach dem Dezimaltrennzeichen – Abderrahim

+0

"und Auffüllen eines Dezimaltrennzeichen nach dem Dezimaltrennzeichen mit Nullen auf der rechten Seite (rpad)." Das bekommst du nicht von deiner Frage :(. Ich denke, mein Ansatz passt nicht zu dir. –

0

select lpad(rpad(replace('5.95','.',''),4,0),8,0) from dual;

Unter der Annahme, dass Sie entweder Skala haben oder nicht, hat string Suffix sein mit 0 und Präfix 0 bis 8. Stelle. Ich poste die Abfrage.

Lassen Sie mich wissen, ob dies Ihre Anforderung erfüllt oder etwas anderes erforderlich ist.

select lpad(rpad(replace('5.95','.',''),4,0),8,0) from dual;

Verwandte Themen