Laden...

Dezimalpunkte durch Kommas ersetzten

Erstellt von Montana vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.706 Views
M
Montana Themenstarter:in
2 Beiträge seit 2009
vor 14 Jahren
Dezimalpunkte durch Kommas ersetzten

HI,
Ich bin neu hier und muss euch gleich mit einem Problem belästigen.

Für die Schule muss ich ein Messwertprogramm erstellen. Die Daten werden in die Richtextbox geladen und dann wird der Mittelwert berechnet. Soweit so gut.

Die Aufgabe lautet nun ein Programm zu entwickeln, dass die Dezimalpunkte der Messwertergebnisse in Kommas umwandelt.

Die Textdatei ist folgendermaßen aufgebaut:

Datum/Uhrzeit Raum1 Raum2 Raum3 Raum4 Raum5 Raum6 Raum7 Mittelwert
07.09.09 00:08 18.0 18.0 20.0 18.0 19.0 22.0 20.0 19.29

Das Problem für mich ist, dass die Punkte beim Datum nicht geändert werden sollen.

Ein Lösungsansatz habe ich überhaupt noch nicht, ich hab einzing un alleine das:

 private void button1_Click(object sender, EventArgs e)
        {
            //Daten der Textbox laden

            richTextBox1.LoadFile("Cleopatra.txt", RichTextBoxStreamType.PlainText);

        }

        private void button2_Click(object sender, EventArgs e)
        {
            //Mittelwert aller vorhandenden Daten ausrechnen

            //Help-Variable erstellen

            double Mittel = 0;

            string help = richTextBox1.Text;

            string[] zeilen = help.Split('\n');

            int zNr = 0;

            //Schleife starten, um alle Zahlen aus zu lesen

            foreach (string zeile in zeilen)
            {
                zNr++;
                if((zNr > 4) & (zeile.Length > 0))
                {
                    string[] detail = zeile.Split('\t');
                   
                    Mittel = Mittel + Convert.ToDouble(detail[3]);
                }

            }

            //Mittelwert berechnen

            Mittel = Mittel / 24;

            //Mittelwert ausgeben

            MessageBox.Show("Mittel = " + Mittel.ToString());

        } 

Ich hoffe ihr könnt mir helfen.

Schöne Grüße
Dominik

P.S. Hoffe bin hier richtig.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Montana,

du benutzt doch String.Split und Convert.ToDouble (besser wäre double.Parse). Das ist doch schon mal gut.

Aus meiner Sicht, musst du nur noch zwei Sachen machen:

  • Bei double.Parse CultureInfo.InvariantCulture benutzen. Das ist professioneller und sicherer als die Ersetzung von Punkt in Komma.
  • Bei dem Ergebnis von String.Split das erste und zweite Element (das mit dem Datum und das mit der Uhrzeit) auslassen.

Beachte trotzdem vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

herbivore

F
240 Beiträge seit 2006
vor 14 Jahren

schau dir mal die jeweilige .ToString() Methode (int.ToString(), double.ToString() etc) sowie die Formatstrings im msdn an.

U
1.688 Beiträge seit 2007
vor 14 Jahren

Das Problem für mich ist, dass die Punkte beim Datum nicht geändert werden sollen.
...

if((zNr > 4) & (zeile.Length > 0))  
                {  
                    string[] detail = zeile.Split('\t');  
                     
                    Mittel = Mittel + Convert.ToDouble(detail[3]);  
                }  
...  
            Mittel = Mittel / 24;  
  

Deine Messwerte sind durch '\t' getrennt? Dann kannst Du doch Datum und Uhrzeit nach dem Split ausschließen, indem Du auf die entsprechenden Feldelemente gar nicht zugreifst. Nichtsdestotrotz solltest Du nur mit CultureInfo.InvariantCulture arbeiten, wie herbivore schon schrieb.

Wie soll eigentlich Dein Mittelwert gebildet werden? Du benutzt oben nur den Wert für Raum 2.

Schließlich sollte die Gesamtsumme natürlich durch die Anzahl geteilt werden, nicht durch eine Konstante (24).

M
194 Beiträge seit 2008
vor 14 Jahren

Wenn ich das richtig verstanden habe willst du die Zahlen, welche als Zeichenfolge vorliegen in Double parsen. Das geht sehr gut, indem du Kultureinstellungen verwendest. Die folgende Funktion wandelt dir einen String in eine Double-Zahl um, du kannst den verwendeten Dezimalseparator festlegen.

using System.Globalization;
public double ParseStringToDouble (string sValue, string sDecimalSep, string sGroupSep)
{ 
    private NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat.Clone() as NumberFormatInfo;
    
    //Dezimaltrennzeichen festlegen
    nfi.NumberDecimalSeparator = sDecimalSep;
    
    //Tausendertrennzeichen festlegen
    nfi.NumberGroupSeparator = sGroupSep;
    
    double dRetVal = 0.0;
    if (Double.TryParse(sValue, NumberStyles.Number, nfi, out dRetVal))
    {
    }
    else
    {
        dRetVal = Double.NaN;
    }
    return dRetVal;
}

Beste Grüße

"Indem Sie über dieses ernste Thema lachen disqualifizieren Sie sich selbst."
mrleeh.de

M
Montana Themenstarter:in
2 Beiträge seit 2009
vor 14 Jahren

Danke euch.
Hat mir geholfen.