Seite 1 von 3

Rundung auf zwei Stellen nach dem Komma

Verfasst: 31.01.2011, 16:34
von Nick_Ko
[fontsize=2][font=arial]Hallo,

ich habe ein Problem mit der Rundung auf zwei Stellen (kaufm.). Ich habe einen Wert, der geliefert wird, einen, den der User eingibt. Daraus wird ein neuer Wert errechnet. Dieser soll immer mit zwei Stellen ausgegeben werden.

Ich hatte es so probiert:
[/font]
[/fontsize][fontsize=2][fontsize=2]var[/fontsize][/fontsize][fontsize=2] repl [/fontsize][fontsize=2][fontsize=2]=[/fontsize][/fontsize][fontsize=2] UEBERZIEHUNG1.rawValue.replace(","[/fontsize][fontsize=2][fontsize=2],[/fontsize][/fontsize][fontsize=2]".") [/fontsize][fontsize=2][fontsize=2]// replace() wird benötigt, um mit Dezimalzahlen (float) rechnen zu können.
[/fontsize]
[/fontsize]
[fontsize=2]
[/fontsize][fontsize=2][fontsize=2]var[/fontsize][/fontsize][fontsize=2] betr [/fontsize][fontsize=2][fontsize=2]=[/fontsize][/fontsize][fontsize=2] parseFloat(repl) [/fontsize][fontsize=2][fontsize=2]+[/fontsize][/fontsize][fontsize=2] parseFloat(Dispo.rawValue) [/fontsize][fontsize=2][fontsize=2]// der Kontosaldo, der im Feld UEBERZIEHUNG1 geliefert wird, ist negativ, der Dispo wird positiv eingegeben.
[/fontsize]
[/fontsize]
[fontsize=2]
[/fontsize][fontsize=2][fontsize=2]betr = (Math.round( betr * 100 ) / 100).toString(); //Rundung auf zwei Stellen nach dem Komma und Konvertierung in String
[/fontsize]
[/fontsize]
[fontsize=2]
[/fontsize][fontsize=2][fontsize=2]betr += (betr.indexOf('.') == -1)? '.00' : ' '; //Bei Ganzzahl Ergänzung von zwei Kommastellen
[/fontsize]
[/fontsize]
[fontsize=2]
betr [/fontsize][fontsize=2][fontsize=2]=[/fontsize][/fontsize][fontsize=2] betr.replace("."[/fontsize][fontsize=2][fontsize=2],[/fontsize][/fontsize][fontsize=2]",") [/fontsize][fontsize=2][fontsize=2]// der Punkt wird wieder durch ein Komma ersetzt[/fontsize][/fontsize]

[font=arial][fontsize=2][fontsize=2]Das funkioniert bei ganzen Zahlen und Zahlen mit zwei Stellen nach dem Komma. Bei Zahlen mit nur einer Stelle nach dem Komma, z.B. 1234,50 wird 1234,5 ausgegeben. [/fontsize][/fontsize]

[fontsize=2][fontsize=2]Im Internet habe ich eine Lösung gefunden, die aber nicht funktioniert. Ich bin mir jetzt nicht sicher, ob das am LCD liegt, oder ob ein Fehler in der Funktion ist:[/fontsize][/fontsize]
[/font][fontsize=2][fontsize=2][fontsize=2]
[/fontsize][fontsize=2][fontsize=2]var[/fontsize][/fontsize][fontsize=2] repl [/fontsize][fontsize=2][fontsize=2]=[/fontsize][/fontsize][fontsize=2] UEBERZIEHUNG1.rawValue.replace(","[/fontsize][fontsize=2][fontsize=2],[/fontsize][/fontsize][fontsize=2]".") [/fontsize][fontsize=2][fontsize=2]// replace() wird benötigt, um mit Dezimalzahlen (float) rechnen zu können.
[/fontsize]
[/fontsize]
[fontsize=2]
[/fontsize][fontsize=2][fontsize=2]var[/fontsize][/fontsize][fontsize=2] betr [/fontsize][fontsize=2][fontsize=2]=[/fontsize][/fontsize][fontsize=2] parseFloat(repl) [/fontsize][fontsize=2][fontsize=2]+[/fontsize][/fontsize][fontsize=2] parseFloat(Dispo.rawValue) [/fontsize][fontsize=2][fontsize=2]// der Kontosaldo, der im Feld UEBERZIEHUNG1 geliefert wird, ist negativ, der Dispo wird positiv eingegeben.
[/fontsize]
[/fontsize]
[fontsize=2]
[/fontsize][fontsize=2][fontsize=2]function[/fontsize][/fontsize][fontsize=2] runden(betr)

{

[/fontsize][fontsize=2][fontsize=2]var[/fontsize][/fontsize][fontsize=2] r [/fontsize][fontsize=2][fontsize=2]=[/fontsize][/fontsize][fontsize=2] (Math.round( betr [/fontsize][fontsize=2][fontsize=2]*[/fontsize][/fontsize][fontsize=2] 100 ) [/fontsize][fontsize=2][fontsize=2]/[/fontsize][/fontsize][fontsize=2] 100).toString();

r    [/fontsize][fontsize=2][fontsize=2]+=[/fontsize][/fontsize][fontsize=2] (r.indexOf('.') [/fontsize][fontsize=2][fontsize=2]==[/fontsize][/fontsize][fontsize=2] [/fontsize][fontsize=2][fontsize=2]-[/fontsize][/fontsize][fontsize=2]1)[/fontsize][fontsize=2][fontsize=2]?[/fontsize][/fontsize][fontsize=2] '.00' [/fontsize][fontsize=2][fontsize=2]:[/fontsize][/fontsize][fontsize=2] '00';

[/fontsize][fontsize=2][fontsize=2]return[/fontsize][/fontsize][fontsize=2] r.substring(0[/fontsize][fontsize=2][fontsize=2],[/fontsize][/fontsize][fontsize=2] r.indexOf('.') [/fontsize][fontsize=2][fontsize=2]+[/fontsize][/fontsize][fontsize=2] 3);

}
[fontsize=2]
betr [/fontsize][fontsize=2][fontsize=2]=[/fontsize][/fontsize][fontsize=2] betr.replace("."[/fontsize][fontsize=2][fontsize=2],[/fontsize][/fontsize][fontsize=2]",") [/fontsize][fontsize=2][fontsize=2]// der Punkt wird wieder durch ein Komma ersetzt[/fontsize][/fontsize]

[font=arial][fontsize=2][fontsize=2]Leider wird hier nix zurückgeliefert. Ich bin ein ziemlicher Laie in JS. Gehe ich richtig in der Annahme, dass die Funktion runden(betr) ihr return wieder in die Variable betr schreibt? Oder brauch ich da noch ein weiteres Statement?[/fontsize][/fontsize]

[fontsize=2][fontsize=2]Danke und liebe Grüße,[/fontsize][/fontsize]

[/font][fontsize=2][fontsize=2][font=arial]Nick_ko
[/font][/fontsize]
[/fontsize]
[/fontsize][/fontsize]
[/fontsize]

Rundung auf zwei Stellen nach dem Komma

Verfasst: 31.01.2011, 16:52
von nele_sonntag
Verständnisfrage.

Warum benutzt Du nicht das Objekt "Dezimalfeld" aus der Bibliothek? Wenn Du rein theoretisch den User 1,119 eingeben lässt, rundet er von selbst im Ergebnisfeld auf 2 Nachkommastellen, wenn Du es so eingibst und gibt dann 1,2 aus.

LG Mandy

PS: PDF (mit kurzer Beschreibung, was welches Feld tut bzw. tun soll) hochladen ist immer zur Lösungsfindung hilfreich.

Rundung auf zwei Stellen nach dem Komma

Verfasst: 31.01.2011, 17:06
von Nick_Ko
Hallo Mandy,

in dem Feld passiert noch viel mehr. Ich hab es mal angehängt, bitte abspeichern und das .pdf entfernen, es ist eine XDP-Datei.

Es werden einige Daten geliefert, einige gibt der User ein. Durch Auswahl eines Dropdown-Eintrags im Feld FORDERUNGSART wird die Programmierung im exit-event ausgelöst.

Ich hab die Texte so fürchterlich gestückelt, weil er einen String, in den ich die ganzen Variablen (text"+var+"text) einsetze, nicht akzeptiert hat.

LG Nick_ko

Rundung auf zwei Stellen nach dem Komma

Verfasst: 31.01.2011, 21:58
von nele_sonntag
Ich kann die xdp leider nicht öffnen, er sagt es fehlen ihm Daten? Eine andere Idee?

Rundung auf zwei Stellen nach dem Komma

Verfasst: 01.02.2011, 08:37
von Nick_Ko
Hmm, das wird an der Binding-Datei liegen. Ich häng es nochmal als dynamischen PDF an. Es ist nicht befüllt, aber wenn man die Felder Kontonummer und Überziehung1 unten rechts befüllt, funktioniert die Programmierung.

Nur eben nicht bei der ersten Auswahl, wegen der geänderten Programmierung. Bei dem zweiten und dritten Eintrag im Dropdown ist der Fehler ersichtlich (Einfach im Feld Überziehung1 5000,50 eingeben).

Rundung auf zwei Stellen nach dem Komma

Verfasst: 01.02.2011, 12:40
von nele_sonntag
Auch jetzt verstehe ich nicht, wieso Du keine Dezimalfelder u.ä. nimmst.

Um die ausgerechnete Summe im Text zu übernehmen ist es nicht nötig.

Du hast Dir auch viel zu viel Mühe mit Deinen Variablen gemacht, um einen Brieftext zu generieren. Dann musst Du auch keine Zahlen in einen String umwandeln...

Das geht viel einfacher. Exit und this ist nicht so geeignet..

Code: Alles auswählen

//ins CHANGE-Ereignis Deines DD 
switch (xfa.event.newText)
{
case "Informationen über Ihre aktuelle Kontoüberziehung" :
         brieftext.rawValue = "mit diesem Schreiben informieren wir Sie über die momentane Kontobeanspruchung.nnIhr Konto " + KONTONUMMER.rawValue + "blabla..";

...
  • String und ausgelesene Textfelder kannst Du ganz einfach über das + verknüpfen
  • Zeilenumbruch über \n
  • wenn die Darstellung Deinen Wünschen nicht entspricht, kann es mitunter, bspw. bei Datumsfeldern, sinnvoller sein den formattedValue zu nehmen

Rundung auf zwei Stellen nach dem Komma

Verfasst: 01.02.2011, 13:33
von Nick_Ko
Danke für den Tip, ich werde das mal ausprobieren.

Eine Frage hab ich noch: Mir wird ja ein Zahlenwert geliefert - das ist immer ein string mit Komma als Dezimaltrennzeichen. Kann ich mit dem rechnen, oder muss ich immer per replace das Komma durch einen Punkt ersetzen und dann mit parseFloat() konvertieren?

Oder reicht es, wenn ich das Feld, in das der Zahlenwert geliefert wird als Dezimalfeld definiere, und es wird automatisch konvertiert?

LG Nick_ko

Rundung auf zwei Stellen nach dem Komma

Verfasst: 01.02.2011, 14:42
von nele_sonntag
So, musste jetzt auch grad mal schauen.
  • bei einem Feld, welches der User eingibt, würde ich einfach per RegExp nur Zahlen und einen Punkt erlauben
  • bei den Werten aus dem System wirst Du um eine Konvertierung nicht umhinkommen
  • einen String konvertieren in eine Zahl, kannst Du mit
  • Code: Alles auswählen

    Number(Textfeld.rawValue)
  • aber tatsächlich musst Du das Komma durch einen Punkt ersetzen
Den entscheidenden Tipp für REPLACE, gab mir gerade yuc2me

Im Exit event des entsprechenden Textfeldes
var rawString = this.rawValue;
var fmtString = String(rawString).replace(",",".");
this.rawValue = fmtString;

Rundung auf zwei Stellen nach dem Komma

Verfasst: 01.02.2011, 17:04
von Nick_Ko
Soo, ich habe jetzt die komplette Programmierung umgestellt - nur noch halb so viel Code wie vorher und viel übersichtlicher.

Ich habe es ähnlich wie yuc2me gelöst:
[fontsize=2]
betr [/fontsize][fontsize=2][fontsize=2]=[/fontsize][/fontsize][fontsize=2] betr.toString();

betr [/fontsize][fontsize=2][fontsize=2]+=[/fontsize][/fontsize][fontsize=2] (betr.indexOf('.') [/fontsize][fontsize=2][fontsize=2]==[/fontsize][/fontsize][fontsize=2] [/fontsize][fontsize=2][fontsize=2]-[/fontsize][/fontsize][fontsize=2]1)[/fontsize][fontsize=2][fontsize=2]?[/fontsize][/fontsize][fontsize=2] '.00' [/fontsize][fontsize=2][fontsize=2]:[/fontsize][/fontsize][fontsize=2] '00';

[/fontsize][fontsize=2][fontsize=2]var[/fontsize][/fontsize][fontsize=2] p [/fontsize][fontsize=2][fontsize=2]=[/fontsize][/fontsize][fontsize=2] betr.indexOf('.');

betr [/fontsize][fontsize=2][fontsize=2]=[/fontsize][/fontsize][fontsize=2] betr.substring(0[/fontsize][fontsize=2][fontsize=2],[/fontsize][/fontsize][fontsize=2] p) [/fontsize][fontsize=2][fontsize=2]+[/fontsize][/fontsize][fontsize=2] ',' [/fontsize][fontsize=2][fontsize=2]+[/fontsize][/fontsize][fontsize=2] betr.substring(p[/fontsize][fontsize=2][fontsize=2]+[/fontsize][/fontsize][fontsize=2]1[/fontsize][fontsize=2][fontsize=2],[/fontsize][/fontsize][fontsize=2] p[/fontsize][fontsize=2][fontsize=2]+[/fontsize][/fontsize][fontsize=2]3);

[/fontsize]Es funktioniert noch nicht alles, und es scheint mir der Fehler aufzutauchen, wegen dem ich ursprünglich so viele Variablen mit Textbrocken verwendet habe: Wenn ich im switch den brieftext.rawValue belege mit

brieftext.rawValue = "texttexttext "+var1+" texttext "+var2+var3+" texttext";

fällt er mir auf die Nase. Ich habe versucht, var2 und var3 auf folgende Weisen hintereinander zu nennen:

+var2+var3+

+var2+""+var3+

+var2,var3+

+var2++var3+

Nichts von alledem hat funktioniert. Zur Info: var2 und var3 liefern beide zusätzliche Textbrocken. Ich weiß nicht, ob es damit zusammenhängt, oder ob ich einen syntaktischen Fehler mache.

LG Nick_ko

Rundung auf zwei Stellen nach dem Komma

Verfasst: 01.02.2011, 18:06
von nele_sonntag
Für mich ist immer noch nicht genau ersichtlich, warum die so viele Variablen verwendest, obwohl es auf den ersten Blick unnötig erscheint, bspw. Kontonummer, Frist, Berater um nur ein paar zu nennen.

Es ist mir auch nicht klar, wo für Dich die Erleichterung ist, denn ob ich

Code: Alles auswählen

brieftext.rawValue = "Sie müssen zahlen: " + geld.rawValue
oder ich oben geld.rawValue in eine Varibale schreibe, um den String dann so

Code: Alles auswählen

brieftext.rawValue = "Sie müssen zahlen: " + geld
zusammenzusetzen.

Ich würde denken, mehr Code, mehr Möglichkeiten, Fehler einzubauen :-(

Wo in Deinem Skrip hast Du var2 und var3, ich finde es nicht. Verbinden kannst Du nur +, Kommata geht nicht. Wenn dies nicht funktioniert, stimmt etwas mit den Variablen nicht. Aber wie schon vorhin beschrieben, für Text musst Du keine zusätzliche Variable einführen.

Code: Alles auswählen

brieftext.rawValue = "hallo:" + var2 + " " + var3;