String nach Double mit Punkt Trennzeichen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Amro.

    Ah Ok ,Sorry hab es geändert.
    Die SLN-Datei gehört zum Projekt, obj- und bin-Verzeichnis gehören NICHT in die ZIP-Datei.

    ist auch erledigt.

    RodFromGermany schrieb:

    Benenne diesen Deinen Thread nach CSHARP um!

    C# hab ich jetzt nur gewählt wegen

    Dksksm schrieb:

    was für ein Krampf, sorry ich mache seit Jahren nichts in VB)
    :)

    RodFromGermany schrieb:

    Was muss ich tun, um Deinen Effekt zu reproduzieren??

    Eigentlich einfach das Projekt ausführen und versuchen die Spalte 'Position' zu sortieren.
    Es wird als String Sortiert, so bekomm ich das ja auch aus der DB.
    Jetzt wollte ich die Spalte zu Double Convertieren. Da haut er , je nach dem ob ich Parse oder mit Convert.ToDouble, den Punkt raus oder ersetzt ihn durch ein Komma.
    Wenn ich das jetzt mit CellFormatting-Event hinbekomme, kann der String drin bleiben.
    Die Sortierung bei Spalte Position muss nur numerisch sein.
    Also so Aufsteigend:
    1
    1.1
    1.2
    2
    2.5
    3
    10
    20
    Absteigend:
    20
    10
    30
    2.5
    2
    1.2
    1.1
    1
    und als Trennzeichen halt der Punkt.

    Edit:
    Eigentlich will ich nur Sortieren und hab mich in Convert , Parse und CultureInfo verrannt glaub ich ||
    Dateien
    • TestStrDbl.zip

      (16,67 kB, 35 mal heruntergeladen, zuletzt: )

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Amro“ ()

    Also ich würde eine eigene (unsichtbare) Spalte mit fortlaufender Nummerierung verwenden, wie bereits vorgeschlagen. Für spätere evtl. aufkommende Anforderung bzgl. der Nummerierung wäre man dann flexibel.

    Ich habe so etwas selbst bei mir in einem Projekt umgesetzt. Dort gibt es noch mehr Ebenen als die beiden (z.b. 1.2.3.1). Zudem können dort Buchstaben (1.2, 1.2a, 1.2.b) verwendet werden.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Amro schrieb:

    Die Sortierung bei Spalte Position muss nur numerisch sein.
    Dann pack in die Spalte Position Zahlen und keine Strings.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @mrMo

    mrMo schrieb:

    Also ich würde eine eigene (unsichtbare) Spalte mit fortlaufender Nummerierung verwenden

    Dein Vorschlag hab ich getestet und es funktioniert auch.

    @RodFromGermany

    RodFromGermany schrieb:

    Dann pack in die Spalte Position Zahlen und keine Strings.

    Wo wir wieder am Anfang des Threads wären.
    Ich bekomme die Daten 'Position' als String aus einer DB wie im Beispiel.
    Angenommen ich durchlaufe das ganze in eine Schleife und füge die Daten aus der DataTable in die DGV.
    Dann versuch ich die Spalte Position in eine Gleitkommazahl umzuwandel,tritt genau dieser Effekt auf!!
    Also mit CulturInfo versucht Komma durch Punkt zu ersetzten. Geht nicht!
    Wenn du mein Beispiel nimmst , versuch bitte den Datentyp der Spalte Position in eine Gleitkommazahl
    umzuwandeln. Vielleicht verstehst du dann was ich mein.
    Aber änder nicht die Daten der DTStückliste , Spalte Position muss ein String bleiben.
    Hab es auch mit Clone der DT versucht und da die Spalte als Doube/Decimal angelegt.
    Sobald es an die DGV übergeben wird, wird es wieder zum String. Oder der wert bekommt je nach Convertierung ein Komma oder wird zu eine Ganzzahl --> 2.1 wird 21 zBsp
    @Amro Füge der GUI einen weiteren Button "en-US" hinzu.
    Drücke abwechselnd die Button "de" und "en".
    Was ist nicht so, wie es sein soll?
    Spoiler anzeigen

    C#-Quellcode

    1. using System;
    2. using System.Data;
    3. using System.Globalization;
    4. using System.Windows.Forms;
    5. namespace TestStrDbl
    6. {
    7. public partial class Form1 : Form
    8. {
    9. DataTable DTStückListe;
    10. public Form1()
    11. {
    12. InitializeComponent();
    13. button2.Enabled = false;
    14. button3.Enabled = false;
    15. }
    16. private void button1_Click(object sender, EventArgs e)
    17. {
    18. LoadStückListe();
    19. button2.Enabled = true;
    20. button3.Enabled = true;
    21. }
    22. private void LoadStückListe()
    23. {
    24. DTStückListe = new DataTable();
    25. DTStückListe.Columns.Add("Bezeichnung", typeof(string));
    26. DTStückListe.Columns.Add("Position", typeof(decimal));
    27. DTStückListe.Columns.Add("Menge", typeof(int));
    28. DTStückListe.Rows.Add("BG1", 1, 5);
    29. DTStückListe.Rows.Add("Schraube", 1.1, 20);
    30. DTStückListe.Rows.Add("UScheibe", 1.2, 20);
    31. DTStückListe.Rows.Add("BG2", 2, 1);
    32. DTStückListe.Rows.Add("BG3", 10, 2);
    33. DTStückListe.Rows.Add("BG3", 20, 3);
    34. DTStückListe.Rows.Add("BG4", 3, 8);
    35. DTStückListe.Rows.Add("BG5", 2.5, 1);
    36. DGV.DataSource = DTStückListe;
    37. }
    38. private void button2_Click(object sender, EventArgs e)
    39. {
    40. DGV.Columns["Position"].DefaultCellStyle.FormatProvider = CultureInfo.CreateSpecificCulture("de-DE");
    41. }
    42. private void button3_Click(object sender, EventArgs e)
    43. {
    44. DGV.Columns["Position"].DefaultCellStyle.FormatProvider = CultureInfo.CreateSpecificCulture("en-US");
    45. }
    46. }
    47. }
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hab es jetzt so erweitert wie du es beschrieben hast.
    Sorry aber bei mir ändert sich gar nix!
    :)

    Edit:
    Ok du hast den Typ auf Decimal geändert das geht natürlich.

    Amro schrieb:

    Aber änder nicht die Daten der DTStückliste , Spalte Position muss ein String bleiben.

    RodFromGermany schrieb:

    DTStückListe.Columns.Add("Position", typeof(decimal));

    Ich bekomme diesen wert als String.
    Und so wie du das gemacht hast schmeißt er gleich das Komma raus.
    1.2 wird ---> 12 schon beim Laden der Daten.




    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Amro“ ()

    @Amro Läuft genau dieser Code bei Dir in diesem speziellen Testprojekt?
    Was unterscheidet Deinen Arbeitscode von dem Code aus dem Testprojekt?
    ====
    Wenn Du die Daten aus einer Datenbank einliest und die Spalte "Position" ist ein String, dann musst Du diese Spalte in einen numerischen Typ konvertieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    dann musst Du diese Spalte in einen numerischen Typ konvertieren.

    Das versuche ich ja die ganze Zeit.
    Macht der ja nicht, sobald du es an die DGV übergibst bring die die ganze Convertierung nix und auch nicht die CuturInfo.

    RodFromGermany schrieb:

    Was unterscheidet Deinen Arbeitscode von dem Code aus dem Testprojekt?


    Ich hab jetzt nur den zugriff und den TableAdapter weggelassen und natürlich etwas weniger Daten.
    Hast du es mal getestet?
    Aber der Effekt ist der gleiche.
    Man kann jetzt die DTStückliste NICHT als Datasource übergeben und das ganze händisch machen.
    Also in eine For Schleife und dann die DTStückliste.Row["Position"] als Decimal von mir aus convertieren.
    Aber das ändert nix !
    Ich kann das Beispiel erweitern wenn du willst.
    Hast du es getestet, ist es bei dir auch so?
    @Amro Bei mir sortiert er die Spalte nach der Größe des numerischen Wertes, auf und ab.
    Bei mir kann ich permanent zwischen 1,1 und 1.1 umschalten.
    Gibt es weitere Punkte, was passieren soll?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das funktioniert jetzt!!!
    Anscheinend muss auch die Variable PosNum die CulturInfo bekommen beim Parsen.
    Mal sehen ob es mit Datenbindung ( Datasource) auch geht.
    Hatte mal gelesen das der SortCompare-Event nicht auslöst bei Datenbindung.

    C#-Quellcode

    1. private void button4_Click(object sender, EventArgs e)
    2. {
    3. if (DTStückListe == null) return;
    4. //
    5. DGV.DataSource = null;
    6. DGV.Columns.Clear();
    7. DGV.Rows.Clear();
    8. DGV.Columns.Add("ColBezeichnung", "Bezeichnung");
    9. DGV.Columns.Add("ColPosition", "Position");
    10. DGV.Columns.Add("ColMenge", "Menge");
    11. DGV.Columns["ColBezeichnung"].ValueType = typeof(string);
    12. DGV.Columns["ColPosition"].ValueType = typeof(decimal);
    13. DGV.Columns["ColBezeichnung"].ValueType = typeof(int);
    14. DGV.Columns["ColPosition"].DefaultCellStyle.FormatProvider = CultureInfo.CreateSpecificCulture("en-US");
    15. foreach (DataRow dataRow in DTStückListe.Rows)
    16. {
    17. decimal PosNum = decimal.Parse(dataRow["Position"].ToString(), CultureInfo.CreateSpecificCulture("en-US"));
    18. // double PosNum = double.Parse( dataRow["Position"].ToString(), CultureInfo.CreateSpecificCulture("en-US"));
    19. DGV.Rows.Add(dataRow["Bezeichnung"], PosNum, dataRow["Menge"]);
    20. }
    21. }

    Bei mir sortiert er die Spalte nach der Größe des numerischen Wertes, auf und ab.

    Es muss mit 2 weitergehen nach der 1.2 das macht es nicht bei mir.
    Bilder
    • sort.png

      17,24 kB, 567×616, 25 mal angesehen

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Amro“ ()

    Amro schrieb:

    C#-Quellcode

    1. foreach (DataRow dataRow in DTStückListe.Rows)
    Was soll das?
    Manipulierst Du jetzt die Daten sowohl in der DataTable als auch im DGV?
    Das geht schief!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Amro Mein Beispiel findest Du in Post #25.
    Füge Deiner DataTable eine Spalte hinzu, in der der numerische Wert des besagten String-Wertes abgelegt wird
    oder
    mach eine neue Tabelle, die der in meinem Code entspricht, und konvertiere die ganze Tabelle (alle Spalten minus einer kopieren, eine konvertieren).
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!