Zahlen formatiert ausgeben

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Zahlen formatiert ausgeben, cool

Beitrag von NicTheQuick »

Ich hab mir es etwas einfacher gemacht und die Möglichkeit für binäre und dezimale Präfixe eingebaut. Dafür habe ich die Konvertierung von Punkt in Komma weg gelassen.
Ich persönlich teile immer noch lieber durch 1024 als durch 1000. :wink: Aber ich kann mir bei Autos auch immer noch mehr unter PS als unter kW vorstellen, obwohl ich das versuche zu ändern. :lol:

Code: Alles auswählen

Procedure.s digit(value.q, binary.i = #True)
	Static shorts.s = "kMGTPE"
	Protected i.i = 0, result.d = value
	
	If value < 1024
		ProcedureReturn StrU(value, #PB_Quad) + " B"
	EndIf
	
	While result >= 1024
		result / (1000 + 24 * Bool(binary))
		i + 1
	Wend
	
	ProcedureReturn StrD(result, 2) + " " + Mid(shorts, i, 1) + Left("i", Bool(binary)) + "B"
EndProcedure


Debug "Binärpräfixe:"
For i = 1 To 18
	Debug digit(Pow(10, i), #True)
Next

Debug ""
Debug "Dezimalpräfixe:"
For i = 1 To 18
	Debug digit(Pow(10, i), #False)
Next
Edit:
Ich hatte noch einen Fehler drin. Danke, walbus!
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Zahlen formatiert ausgeben

Beitrag von GPI »

Da will man nur Codes in Archiv übernehmen und dann packt einen die Programmiererwut :)

Code: Alles auswählen

EnableExplicit

Procedure.s NumberFormat(Value.d,  DecimalGroup=2, DecimalSep$=".",ThousandGroup=3, ThousandSep$=",",SignFirst=#True,AlwaysSign=#False)
  Protected ret.s
  Protected sign
  If value<0
    value=-value
    sign=1
  EndIf
  Protected number$=StrD(Value,DecimalGroup)  +"."
  Protected left.s=StringField(number$,1,".")
  Protected right.s=StringField(number$,2,".")
  Protected i=Len(left)-ThousandGroup
  
  If ThousandGroup>0
    While i>0
      left=Left(left,i)+ThousandSep$+Right(left,Len(left)-i)
      i-ThousandGroup
    Wend
  EndIf
  If left=""
    left="0"
  EndIf
  ret=left+DecimalSep$+right
  If sign Or AlwaysSign
    If signfirst
      ret=Mid("+-",sign+1,1)+ret
    Else
      ret=ret+Mid("+-",sign+1,1)
    EndIf
  EndIf
  
  ProcedureReturn ret
EndProcedure
Procedure.s ByteFormat(value.q, force=0, binary.i = #True)
  Static shorts.s = "kMGTPE"
  
  Protected i.i = 0, result.d = value
  
  
  
  If force
    While force
      result / (1000 + 24 * Bool(binary))
      i + 1
      force-1
    Wend
  Else
    If value < 1024 And force=0
      ProcedureReturn NumberFormat(value) + " B"
    EndIf
    While result >= 1024
      result / (1000 + 24 * Bool(binary))
      i + 1
    Wend
  EndIf
  
  
  ProcedureReturn NumberFormat(result,2)+ " " + Mid(shorts, i, 1) + Left("i", Bool(binary)) + "B"
EndProcedure



Debug NumberFormat(-1234567899.2356, 2)
Debug NumberFormat(-1234567899.2356, 3,",",3,".")
Debug NumberFormat(-1234567899.2356, 3,",",0)

Debug NumberFormat(1234567899.2356, 2,".",3,",",#False,#True)
Debug NumberFormat(1234567899.2356, 3,",",3,".",#True,#True)
Debug NumberFormat(1234567899.2356, 3,",",0,".",#False,#True)

Define i

Debug "Binärpräfixe:"
For i = 1 To 18
  Debug ByteFormat(Pow(10, i),0, #True)
Next

Debug ""
Debug "Dezimalpräfixe:"
For i = 1 To 18
  Debug ByteFormat(Pow(10, i),0, #False)
Next

Debug ""
Debug "Dezimalpräfixe in mb"
For i = 1 To 18
  Debug ByteFormat(Pow(10, i),2, #False)
Next

RSBasic Beispiel hab ich mal für alle Betriebsysteme umgesetzt und ein bischen zwecks Vorzeichen erweitert. Nics Code enthält jetzt die Möglichkeit die Ausgabe auf eine bestimmte Größe festzusetzen, so dass bspw. alle in MB ausgegeben wird.

Wird in CodeArchiv unter Strings\NumberFormat_and_ByteFormat.pbi auftauchen.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Antworten