[gelöst] FORMAT: Vorzeichen, Füllzeichen, variable Precision

26. Oktober 2010 15:50

Ich kämpfe mit einer Formatierung, finde aber in keinem Thread eine Lösung :-(

Problemstellung:
- die Gesamtlänge des Werte soll 14 Stellen sein
- das Vorzeichen (-) soll an 1.Stelle stehen und nur bei negativen Werten
- die Precision soll sich am Feld orientieren (z.B. "Sales Invoice Header"."Currency Factor")
- das Füllzeichen soll '0' sein
- Dezimalzeichen soll Komma sein

also z.B.
123.4 => 0000000000123,4
-123.4 => -000000000123,4
123.45 => 000000000123,45
-123.45 => -00000000123,45
123 => 000000000000123
-123 => -00000000000123

Es funktionieren nicht
Code:
FORMAT(l_decWert,15,'<Sign><Integer><Filler Character,0><Decimals><Comma,,>');

=> da wird vorne mit Blank aufgefüllt, dann das Vorzeichen und dann der Wert


Code:
FORMAT(l_decWert,15,'<Sign><Integer,15><Filler Character,0><Decimals><Comma,,>');

=> da verschwindet ein Teil des Integer-Wertes und die Nachkommastellen, weil die 15 Stellen mit Vorzeichen, Füllzeichen und einem Teil vom Integer-Werte schon gefüllt sind

Bin jetzt echt verzweifelt ... :-x :-(
Zuletzt geändert von raggy am 28. Oktober 2010 12:20, insgesamt 2-mal geändert.

Re: FORMAT: Vorzeichen, Füllzeichen, variable Precision

27. Oktober 2010 09:18

Das mit dem Filler hab ich noch nie ausprobiert. Falls das nicht so fruchtet schreib doch eine Schleife die dir den String selbst auffüllt:

Code:
Text := Format(...);
IF STRLEN(Text) < 15 THEN BEGIN
  REPEAT
    INSSTR(Text,'0',2);
  UNTIL STRLEN(Text) = 15;
END;


Der INSSTR füllt in den Text jedesmal eine 0 an Position 2, also hinter dem Vorzeichen nach dem Formatieren.

Re: FORMAT: Vorzeichen, Füllzeichen, variable Precision

27. Oktober 2010 10:38

Besser als so kriege ich es nicht hin:
Code:
a:=FORMAT(d,0,strsubstno('<Sign,1><Filler Character,0><Integer,%1><Filler Character,0><Decimals><Comma,,>',
          MaxLen-1-(strlen(format(abs(d)))-strlen(format(abs(d) div 1)))));

MaxLen ist die gewünschte Länge.

Edit: gekürzt

Re: FORMAT: Vorzeichen, Füllzeichen, variable Precision

27. Oktober 2010 16:18

raggy hat geschrieben:Ich kämpfe mit einer Formatierung, finde aber in keinem Thread eine Lösung :-(

Problemstellung:
- die Gesamtlänge des Werte soll 14 Stellen sein
- das Vorzeichen (-) soll an 1.Stelle stehen und nur bei negativen Werten
- die Precision soll sich am Feld orientieren (z.B. "Sales Invoice Header"."Currency Factor")
- das Füllzeichen soll '0' sein
- Dezimalzeichen soll Komma sein


- 14 oder 15 Stellen? In deinen Beispielen sind es 15 Stellen!
- Was meinst du mit Precision? "Sales Invoice Header"."Currency Factor" ist der Währungsfaktor.
Du meinst wahrscheinlich so etwas wie "General Ledger Setup"."Amount Decimal Places", zum Beispiel: 2:2, oder?

Diese zusammengesetze FORMAT-Anweisung sollte mit den obigen Annahmen funktionieren.
Das Problem hier ist ja eigenlich nur die <Precision> und <Integer> Format Property variabel zu halten.

Code:
IF "General Ledger Setup".GET() THEN
FORMAT(l_decWert,0,'<Precision,'
                   +"General Ledger Setup"."Amount Decimal Places"
                   +'><Sign><Integer,'
                   +FORMAT(15-STRLEN(FORMAT(l_decWert,0,'<Precision,'
                   +"General Ledger Setup"."Amount Decimal Places"
                   +'><Sign><Decimals>')))
                   +'><Filler Character,0><Decimals><Comma,,>');


[EDIT]Ohne Precision wäre es natürlich etwas einfacher. :wink:

Code:
FORMAT(l_decWert,0,'<Sign><Integer,'
                   +FORMAT(15-STRLEN(FORMAT(l_decWert,0,'<Sign><Decimals>')))
                   +'><Filler Character,0><Decimals><Comma,,>');

Für die 15 kann man natürlich auch eine Variable einsetzen oder eine andere maximale Anzahl der Stellen.

P.S.: Orlan und Mclane's Lösung gehen natürlich dann auch!

mfg,
winfy

Re: FORMAT: Vorzeichen, Füllzeichen, variable Precision

28. Oktober 2010 12:19

Mit folgendem Befehl habe ich es jetzt hinbekommen :greenarrow: :

Code:
r_txtText :=
 FORMAT(p_decWert,0,
 '<Precision,'+p_txtPrecision+'><Sign>'+
 '<Integer,'+FORMAT(p_intLength-STRLEN(FORMAT(p_decWert,0,'<Precision,'+p_txtPrecision+'><Sign><Decimals><Comma,,>')))+'>'+
 '<Filler Character,0><Decimals><Comma,,><Precision,'+p_txtPrecision+'>');


Alles in eine zentrale Funktion hinterlegt, mit folgenden Variablen
r_txtText = Rückgabewert formatierter Text (TEXT)
p_decWert = zu formatierender Wert (DECIMAL)
p_intLength = Länge (INTEGER)
p_txtPrecision = Ausdruck für Precision (TEXT)

Tausend Dank nochmals für die Tipps :-D

Re: [gelöst] FORMAT: Vorzeichen, Füllzeichen, variable Preci

28. Oktober 2010 15:26

raggy hat geschrieben:
Code:
r_txtText :=
FORMAT(p_decWert,0,
'<Precision,'+p_txtPrecision+'><Sign>'+
'<Integer,'+FORMAT(p_intLength-STRLEN(FORMAT(p_decWert,0,'<Precision,'+p_txtPrecision+'><Sign><Decimals><Comma,,>')))+'>'+
'<Filler Character,0><Decimals><Comma,,><Precision,'+p_txtPrecision+'>');


...

Tausend Dank nochmals für die Tipps


Keine Ursache! :-D

Nur noch ein paar Anmerkungen.

Code:
<Precision,'+p_txtPrecision+'>');

Das kannst du am Ende weglassen, weil es schon am Anfang steht.

Code:
<Comma,,>

Das kannst du im Integer Property auch weglassen, weil du nur den Punkt mit Komma ersetzt.
Für die Zeichenlänge ist das aber eher unwichtig ist, da die Länge von ',' und '.' auch 1 ist.

mfg,
winfy