Benutzer mit den meisten Antworten
Ergebnis (Label) Dezimalstellen reduzieren

Frage
-
Ich habe hier im Forum zwar gesucht, aber da hat mir leider nichts geholfen.
Ich habe einen kleinen Rechner programmiert.
Die Ergebnisse erscheinen in einem Label, in dem vor der Berechnung nichts steht.
Ich möchte nun, dass Ergebnisse die zum Beispiel periodische Dezimalstellen haben (Bsp: 100 / 3 = 33,3333....) auf eine bestimmte maximale Nachkommastelle gerundet wird, 2 oder 3 Stellen. Jedoch möchte ich, dass Ergebnisse aus eindeutigen Rechnungen auch keine NULLER als Nachkommastellen haben (Bsp: 50 / 2 = 25,000).
Ich habe erst vor kurzer Zeit mit VisualBasic begonnen und weiß deshalb nicht ob ihr noch Informationen braucht (das Programm ist eine Windows Forms-Anwendung).
Schonmal danke im Voraus für Antworten.
lG
- Verschoben Dimitar DenkovMicrosoft contingent staff, Administrator Montag, 8. Dezember 2014 13:20 richtiges Unterforum
Antworten
-
Stefans Lösung macht das so, wobei du auch meine nutzen könntest und einfach nichts im ToString() übergibst:
Label1.Text = Math.Round(value, 3).ToString()
Da würde dann nur die Round-Methode greifen.
Du musst entscheiden ob 2/3 als 0,666 oder 0,667 dargestellt werden sollen. Das Letzte wird ohne Parameter in ToString mit Round erzeugt und wäre wohl "richtiger" (es sei denn du willst es nur abschneiden).Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 11. März 2014 21:01
- Als Antwort markiert Ciprian Bogdan Donnerstag, 13. März 2014 14:16
Alle Antworten
-
Hi,
dann probier mal:
Dim MeineZahl As Double MeineZahl = 0.12345 Label1.Text = MeineZahl.ToString( "0.####" ) MeineZahl = 25.000 Label2.Text = MeineZahl.ToString( "0.####" )
Der wichtige Teil hierbei ist ToString( "0.####" ), aufgerufen für deine Variable vom Typ Double.
Für weitere Infos zu Formatzeichenfolgen schau mal hier:
http://msdn.microsoft.com/de-de/library/0c899ak8.aspx
http://msdn.microsoft.com/de-de/library/dwhawy9k.aspx
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
- Bearbeitet Stefan FalzModerator Dienstag, 11. März 2014 19:21
- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 11. März 2014 21:01
-
Hallo,
die Math-Klasse ist für sowas dein Freund. Mit Hilfe der Round- und Tostring-Methode bekommst du deinen String:Label1.Text = Math.Round(value, 3).ToString("0.000")
Round rundet hier auf 3 Nachkommastellen. ToString sorgt dafür das immer 3 Dezimalstellen vorhanden sind. In dem oben verlinkten Artikel zur ToString-Methode siehst du auch eine Übersicht über die möglichen Formate.Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hallo Tom,
wenn ich den TE richtig verstanden habe, wollte er maximal 2 oder 3 Nachkommastellen, wenn es eine glatte Ganzzahl ist, dann gar keine. Da wäre 0.### dann passender, 0.000 als Formatangabe würde ja immer drei Nachkommastellen ausgeben, auch wenn die Zahl 25 formatiert wird.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Stefan,
[...] dass Ergebnisse aus eindeutigen Rechnungen auch keine NULLER als Nachkommastellen haben (Bsp: 50 / 2 = 25,000).
Das Beispiel hat auch 3 Nullen, deswegen dachte ich, dass er es so haben möchte.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Hallo Tom,
ich weiß. Ich hab das nur angenommen, weil er "keine NULLER" (also unterstrichen) geschrieben hat.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Ja, das stimmt so Stefan.
Habe das auch extra deswegen unterstrichen und ein Beispiel in Klammern gegeben wie ich es meine, wie es nicht sein soll.
Entschuldigt falls das nicht so klar gewesen ist.
Schreibe es wenn ggf. später mal eine andere Frage aufkommt noch einmal extra dazu ^^
lG
TheCoon
PS: Ist bei einem der Lösungen eine dabei, die das Ergebnis so wie gewollt wiedergibt? -
Hi,
PS: Ist bei einem der Lösungen eine dabei, die das Ergebnis so wie gewollt wiedergibt?
nö. Natürlich nicht. Warum sollte da was dabei sein, dass das macht, was Du willst? :)
Im Ernst: Ja, da ist was dabei. Probier doch einfach mal die beiden Varianten aus, dann siehst Du auch gleich den Unterschied.
Meine Variante zeigt für den ersten Wert 33,3333 und für den zweiten Wert 25 an. UNd wenn ich das richtig verstanden habe, ist das ja das, was Du wolltest.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Stefans Lösung macht das so, wobei du auch meine nutzen könntest und einfach nichts im ToString() übergibst:
Label1.Text = Math.Round(value, 3).ToString()
Da würde dann nur die Round-Methode greifen.
Du musst entscheiden ob 2/3 als 0,666 oder 0,667 dargestellt werden sollen. Das Letzte wird ohne Parameter in ToString mit Round erzeugt und wäre wohl "richtiger" (es sei denn du willst es nur abschneiden).Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Als Antwort vorgeschlagen Stefan FalzModerator Dienstag, 11. März 2014 21:01
- Als Antwort markiert Ciprian Bogdan Donnerstag, 13. März 2014 14:16
-
Tut mir leid, aber mit euren beiden Lösungsvorschlägen komme ich irgendwie nicht weiter ^^''
Bei Stefan's ändert sich bei mir nichts und Koopakiller's Code habe ich Probleme mit "value".
Sie werden wohl richtig funktionieren, nur bin ich ein VisualBasic Neuling und mein Problem wird wahrscheinlich sein, dass ich die Codes falsch positionere und/oder falsch einsetze.
Ich habe nun dieses Video gefunden und mal bei mir ausprobiert: Easy Example (Rounding)
Hiermit funktioniert es wie ich möchte :)
Eine Formel auf meinem Rechner ist zum Beispiel folgende:
Label7.Text = Val(TextBox1.Text / 3) + Val(TextBox2.Text / 3) + Val(TextBox3.Text / 3)
PS: Wie schreibe ich im Forum Codes in solche Codefelder?
Mit der Variante aus dem Video komme ich auf:
Label7.Text = Math.Round(Val(TextBox1.Text / 3) + Val(TextBox2.Text / 3) + Val(TextBox3.Text / 3), 3)
Wunderbar auf 3 Stellen gerundet und wenn das Ergebnis eine ganze Zahl ist wird sie nicht (beim Ergebnis 30) als 30,000 angezeigt sondern als 30.
Falls ihr mir die richtigen Ergebnisse mit euren Codes in meinem Beispiel posten könntet würde mich das freuen. Denn ich würde mir das gerne genauer ansehen.
Und falls die Lösung aus dem Video wegen weiß ich welchen Gründen irgendwie problematisch werden könnte, wenn ein bestimmter Fall o.Ä. auftritt, bitte sagen ^^.Auf jeden Fall schonmal einen herzlichen Dank an euch für eure Antworten.
lG
TheCoon
- Bearbeitet TheCoon Mittwoch, 12. März 2014 13:49
-
Hi,
ausgehend von deinem Codebeispiel:
Label7.Text = Val(TextBox1.Text / 3) + Val(TextBox2.Text / 3) + Val(TextBox3.Text / 3)
könntest Du das dann bspw. so machen:
Dim Zahl1 As Double Dim Zahl2 As Double Dim Zahl3 As Double Double.TryParse( TextBox1.Text, Zahl1 ) Double.TryParse( TextBox2.Text, Zahl2 ) Double.TryParse( TextBox3.Text, Zahl3 ) Label7.Text = ( Zahl1 / 3 + Zahl2 / 3 + Zahl3 / 3 ).ToString( "0.###" )
Code kannst Du hier einfügen, indem Du in der Symbolleiste des Editors auf das Icon mit <> (links neben dem Icon für die Bildeinfügung) klickst, dort die Sprache auswählst und den Code eingibst.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo,
grundsätzlich sehe ich erstmal kein Problem darin den Code aus dem Video zu benutzen, außer das es für einen Neuling später problematisch werden könnte.VB.NET ist die weiterentwicklung von VB und wegen der Abwärtskompatibilität gibt es auch noch die ganzen VB-Funktionen. Hier wird Val(String) verwendet. Wenn du dir dagegen von Anfang an die .NET-Methoden und Klassen ansiehst, wirst du später auch kein großes Problem damit haben C#-Code zu lesen. Zum Umwandeln von Strings zu Zahlen solltest du die Typ.Parse-Methoden oder die Convert-Klasse benutzen:
Label7.Text = Math.Round(Double.Parse(TextBox1.Text / 3) + Double.Parse(TextBox2.Text / 3) + Double.Parse(TextBox3.Text / 3)).ToString() 'bzw. ' Label7.Text = Math.Round(Convert.ToDouble(TextBox1.Text / 3) + Convert.ToDouble(TextBox2.Text / 3) + Convert.ToDouble(TextBox3.Text / 3)).ToString()
Mit den .NET-Methoden hast du auch noch viele weitere Freiheiten. Beispielsweise kannst du angeben, ob ein Komma oder ein Punkt zum Abtrennen der Dezimalzahl dienen soll.
Die gesamte Rechnung habe ich am Ende wieder in einen String zu konvertiert.
Der Compiler lässt dir das durchgehen, weil du Option Strict Off hast. Schreibe einfach folgendes in die Erste Zeile der VB-Datei:Option Strict On
Somit musst du jede Konvertierung expliziet angeben. Das verhindert Fehler zu Laufzeit und zwingt dich so zu sagen dazu ordentlich zu programmieren.
Die Standardeinstellungen für neue Projekte kannst du unter Extras > Optionen > Projete und Projektmappen > VB Standards einstellen.
PS: Codeblöcke kannst du mit dem Code-Button (
) in der Menüleiste einfügen. Dort kannst du auch bis zu 2 Bilder einfügen (
). Dafür muss aber dein Konto überprüft wurden sein. Antworte dazu einfach auf Verify Your Account 14.
PPS: Da du dort die Math.Round-Methode verwendest, hast du meine Lösung implementiert. Es scheiterte wohl eher an der String-Zahl-Konvertierung als am Runden.
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Dankeschön für die Antworten.
Stefan, dein Code funktioniert jetzt auch super.
Koopakiller, deiner funktioniert auch. Aber er gibt nur Ganze Zahlen aus.
Habe mir das auch mit
Option Strict On
angesehen und es wurde mir angezeigt, dass ich gerne ein und den selben Pfusch mache.
Ein paar Mal fehlt ein CDbl und CStr
Der Code von Koopakiller sieht dann z.B. so aus
Label7.Text = Math.Round(Double.Parse(TextBox1.Text / 3) + Double.Parse(TextBox2.Text / 3) + Double.Parse(TextBox3.Text / 3)).ToString()
- Bearbeitet TheCoon Mittwoch, 12. März 2014 16:02
-
Stimt mein Code gibt nur ganze Zahlen aus, weil ich Math.Round keinen 2. Parameter übergeben habe. Hänge noch ein ,3 dran und du hast wieder deine bis zu 3 Nachkommastellen.
Das steht übrigens auch alles in der MSDN-Artikeln zu der Funktion. Siehe hier.
PS: Was ich oben vergessen habe ist, das Konvertierungsfunktionen wie CDbl und Cstr nicht schlechter sind als ToString und Parse. Diese kannst du also weiterhin ohne Probleme verwenden. (VS schlägt die auch selbst vor)
Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite |
Code Beispiele |
Facebook |
Twitter |
Snippets
C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke.- Bearbeitet Tom Lambert (Koopakiller)Moderator Mittwoch, 12. März 2014 16:05 PS
-
Hi,
Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
Wenn nicht, neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
Danke und viele Grüße,
Ciprian
Ciprian Bogdan, MICROSOFT
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip„Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.