Laden...

Bei Decimal 2 Nachkommastellen wenn Nachkommastellen

Letzter Beitrag vor 14 Jahren 9 Posts 45.718 Views
Bei Decimal 2 Nachkommastellen wenn Nachkommastellen

Hallo,

wie vielleicht die Überschrift schon sagt, möchte ich auf 2 Nachkommastellen runden. Aktuell mache ich das so:

decimal d1 = Math.Round(x, 2, MidpointRounding.AwayFromZero);

Dann kann es aber passieren das er mir auch Zahlen mit nur einer Kommastelle ausgibt z.B. so: 10,5

Hier kann ich so dagegen wirken:

ergstr = string.Format("{0:f}", d1);

Allerdings gibt er mir dann auch immer xx,00 aus also mit 2 Kommastellen.

Ich möchte nur 2 Nachkommastellen haben wenn Nachkommastellen vorhanden sind, ansonsten nur ohne Kommastellen ...

Hallo

Ich hätte da eine Idee:


public class MyClass
{
	public static void Main()
	{
		double d = 2.345678;	
		string format = (d.ToString().IndexOf(".") != -1) ? "{0:f}" : "{0}";
		Console.WriteLine(format, d);		
		Console.ReadKey();
	}
}

Gruss Lothi

Hallo,

verwende 0.## als Format.

ZB


decimal d = 3;
string s = d.ToString("0.##");  // -> 3

d = 2.71828m;
s = d.ToString("0.##");         // -> 2.72

Für Console.Write analog.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

Aber hierbei ist z.B. das hier immer noch so:


decimal d = 2.7;
string s = d.ToString("0.##");  // -> 2.7

Soll ober so sein: 2.70

Das hier hat bei mir vorläufig geklappt



int nachkommastellen = 3;
decimal d2 = 2.2646546m;
decimal d1 = Math.Round( d2, nachkommastellen, MidpointRounding.AwayFromZero );

string[] lenghts = d1.ToString().Split(',');            
string s = d1.ToString().PadRight(lenghts[0].Length + 1 + nachkommastellen,'0');
            

Ist aber auch entsprechend umständlich gelöst. Aber mit PadRight kannst du auf jeden Fall 0en manuell auffüllen , musst halt nur rausbekommen wieviele.

Vielleicht hilft dir ja mein Beispiel irgendwie

Hallo Lothi, hallo KroaX,

euer Dezimaltrenner-Suchen schlägt fehl, wenn in den Ländereinstellungen von Windows ein anderer Dezimaltrenner eingestellt ist als ihr erwartet. Ihr solltet für die vor der Suche nach dem Dezimaltrenner erfolgende Wandlung in einen String besser CultureInfo.InvariantCulture benutzen. Dann steht der Dezimaltrenner fest.

herbivore

Soll ober so sein: 2.70

die string-format geschichte ist in .net sehr umfangreich und dieses anliegen recht geläufig und simpel. daher ist die lösung auch simpel 😃


            string formatString = "0";
            if (mydecimal.ToString (CultureInfo.InvariantCulture).Contains (CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator))
            {
                formatString += ".00";
            }

            string s = mydecimal.ToString(formatString);

@KroaX:

ich erlebe es sehr häufig das format-funktionen nachgebaut werden. wenn man schon so was nachbaut, dann sollte man auch "CultureInfo.CurrentCulture.NumberFormat" eigenschaften für dezimaltrennzeichen und alles andere auch verwenden.

edit: wen es sich bei der ausgabe um eine zahl für z.b. eine rechung handelt, dann solltest du den punkt durch "CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator" ersetzen.

@JAck30lena

Perfekt!!! Funktioniert!!!
Danke so komm ich weiter ...

Ja mein Beispiel war auch keine schöne Lösung das war mir klar. Ich wollte auch nur sagen das man es mit der PadRight Funktion von string machen könnte und wollte ein Beispiel dazu geben. Das es bessere Methoden gibt dachte ich mir schon aber ich kannte ohne nachzuschauen grade keine.

Aber man lernt ja nie aus danke 😃