Seite 1 von 4

Nachkommastellen und überflüssige Nullen

Verfasst: 07.11.2005 16:29
von PB42
Hallo,

ich möchte in meiner Ergebnisanzeige 4 Nachkommastellen haben, wobei aber überflüssige Nullen am Ende unterdrückt werden sollen. Was ich also NICHT will, sind folgende Ergebnisanzeigen:

5.5000 oder 70.1200 oder 10.9710 usw., sondern stattdessen 5.5 und 70.12 und 10.971

Wie macht man das? Danke.

PB42

Verfasst: 07.11.2005 16:36
von ts-soft
1. Dein Ergebnis, also das Float * 10000 in Integer umwandeln
2. Inter in String umwandeln
3. letzten 4 Buchstaben von hinten auf 0 parsen und gegebenenfalls entfernen, anzahl der entfernten merken
4. einen punkt in den String setzen, 4 Stelle - entfernter von hinten
5. Float aus String ermitteln

So einfach kannste das machen :mrgreen:

Verfasst: 07.11.2005 16:40
von DarkDragon
ts-soft hat geschrieben:1. Dein Ergebnis, also das Float * 10000 in Integer umwandeln
2. Inter in String umwandeln
3. letzten 4 Buchstaben von hinten auf 0 parsen und gegebenenfalls entfernen, anzahl der entfernten merken
4. einen punkt in den String setzen, 4 Stelle - entfernter von hinten
5. Float aus String ermitteln

So einfach kannste das machen :mrgreen:
Mit Kanonen auf Spatzen? Wozu das ganze in einen Long umwandeln, wenns doch auch StrF() gibt? Da kann man auch die letzten stellen auf 0 hin Parsen.

[EDIT]
Lösung:

Code: Alles auswählen

Procedure.s StrF_Ex(Float.f, NbDecimals)
  Result1.s = StrF(Float, NbDecimals)
  Result2.s = ""
  c = 0
  For k=0 To Len(Result1)-1
    Char.s = Mid(Result1, k, 1)
    If Char = "."
      c = 1
    EndIf
    If c = 1 And Char = "0"
      Break
    EndIf
    Result2 + Char
  Next
  
  ProcedureReturn Result2
EndProcedure

Debug StrF_Ex(123.4500, 4)

Verfasst: 07.11.2005 16:50
von ts-soft
>> Wozu das ganze in einen Long umwandeln
Damit ich auf jedenfall 4 stellen hinter dem Komma habe, sonst muß ich ja noch das komma parsen :mrgreen: :freak:

Natürlich 4 Kommastellen im Wert, ohne das Komma bzw. den Punkt.

//Nachtrag:
Test des Codes von DD:

Code: Alles auswählen

Procedure.s StrF_Ex(Float.f, NbDecimals)
  Result1.s = StrF(Float, NbDecimals)
  Result2.s = ""
  c = 0
  For k=0 To Len(Result1)-1
    Char.s = Mid(Result1, k, 1)
    If Char = "."
      c = 1
    EndIf
    If c = 1 And Char = "0"
      Break
    EndIf
    Result2 + Char
  Next
 
  ProcedureReturn Result2
EndProcedure
StrF_Ex.f
Debug StrF_Ex(13.4504889, 4)
Ich sehe ein falsches Ergebnis :mrgreen:

Verfasst: 07.11.2005 16:51
von PB42
Das ganze mit INTEGER zu machen, darauf bin ich natürlich auch selber gekommen, ts-soft. :mrgreen: Ich suchte nach einer Funktion als Ersatz für StrF, mit welcher man ebenfalls die Anzahl der Nachkommastellen einstellen kann, welche aber dann selbständig überflüssige Nullen erkennt und abschneidet. Wäre ne gute Bereicherung in PB.

PB42

Verfasst: 07.11.2005 16:54
von DarkDragon
ts-soft hat geschrieben:>> Wozu das ganze in einen Long umwandeln
Damit ich auf jedenfall 4 stellen hinter dem Komma habe, sonst muß ich ja noch das komma parsen :mrgreen: :freak:

Natürlich 4 Kommastellen im Wert, ohne das Komma bzw. den Punkt.
Was bringt das dir? Du musst doch eh den ganzen String dann durchgehen und zum schluss musst du dann den String auch noch zerschnibbeln und das Komma reinkleben.

Verfasst: 07.11.2005 16:57
von ts-soft
Vielleicht geht dein Weg ja auch, bei mir ist das ergebnis nur 10x zu gross

Verfasst: 07.11.2005 17:17
von DarkDragon
ts-soft hat geschrieben:Ich sehe ein falsches Ergebnis :mrgreen:

Code: Alles auswählen

Procedure.s StrF_Ex(Float.f, NbDecimals)
  Result1.s = StrF(Float, NbDecimals)
  Result2.s = ""
  For k=Len(Result1) To 0 Step -1
    Char.s = Mid(Result1, k, 1)
    If Char <> "0" And c = 0
      Result2 = Char+Result2
      c = 1
    ElseIf c = 1
      Result2 = Char+Result2
    EndIf
  Next
 
  ProcedureReturn Result2
EndProcedure

Debug StrF_Ex(13.4504889, 4)

Verfasst: 07.11.2005 17:27
von Christi

Code: Alles auswählen

Debug ReplaceString(RTrim(ReplaceString(StrF(20.300, 2), "0", " ", 2)), " ", "0", 2)
:mrgreen:

Verfasst: 07.11.2005 17:32
von ts-soft
@DD
Verstehe ich nicht, was Du meinst, nach Deiner Formel kommt: 113.4505

statt 13.4505