Nachkommastellen und überflüssige Nullen
Nachkommastellen und überflüssige Nullen
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
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
- 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
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
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

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

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

Natürlich 4 Kommastellen im Wert, ohne das Komma bzw. den Punkt.
//Nachtrag:
Test des Codes von DD:
Ich sehe ein falsches Ergebnis 
Damit ich auf jedenfall 4 stellen hinter dem Komma habe, sonst muß ich ja noch das komma parsen


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)

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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Das ganze mit INTEGER zu machen, darauf bin ich natürlich auch selber gekommen, ts-soft.
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

PB42
-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
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.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![]()
Natürlich 4 Kommastellen im Wert, ohne das Komma bzw. den Punkt.
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.
- 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
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

-
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
ts-soft hat geschrieben:Ich sehe ein falsches Ergebnis
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.
Code: Alles auswählen
Debug ReplaceString(RTrim(ReplaceString(StrF(20.300, 2), "0", " ", 2)), " ", "0", 2)

- 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
@DD
Verstehe ich nicht, was Du meinst, nach Deiner Formel kommt: 113.4505
statt 13.4505
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
