Nachkommastellen und überflüssige Nullen

Anfängerfragen zum Programmieren mit PureBasic.
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Nachkommastellen und überflüssige Nullen

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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)
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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:
Zuletzt geändert von ts-soft am 07.11.2005 16:55, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag 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
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Vielleicht geht dein Weg ja auch, bei mir ist das ergebnis nur 10x zu gross
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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)
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Christi
Beiträge: 154
Registriert: 31.08.2004 14:17
Kontaktdaten:

Beitrag von Christi »

Code: Alles auswählen

Debug ReplaceString(RTrim(ReplaceString(StrF(20.300, 2), "0", " ", 2)), " ", "0", 2)
:mrgreen:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

@DD
Verstehe ich nicht, was Du meinst, nach Deiner Formel kommt: 113.4505

statt 13.4505
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten