Zeichen vor und nach einem Zeichen ersetzen und 0 hinzufügen ?

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

    Zeichen vor und nach einem Zeichen ersetzen und 0 hinzufügen ?

    Hallo Leute,

    ich hab ein mehr oder weniger kleines Problemchen.
    Eine Zeichenkette die folgendermaßen aussieht:

    Quellcode

    1. [17.5,27],[18.9,31.2],[20.3,26],[20.4,24],[20.5,29.5],[20.7,19.6],[20.8,22.3],[21.2,14.8],[21.3,32.3]...


    Das Ziel soll eine RichTextBox sein die mit folgenden Daten aus der Zeichenkette gefüllt werden soll:

    Quellcode

    1. [1750270000]
    2. [1890312000]
    3. ...


    Die Abfolge für die Blöcke stelle ich mir folgendermaßen vor:

    [18.9,31.2] -> [18.90,31.2000] -> [1890312000]

    Zusätzlich würde ich an den String noch ein "= 249" anhängen.

    Die Satzzeichen hatte ich im gesamten String schon mit Replace weggemacht. Nun hängt es aber daran, die Nullen hinzuzufügen.
    Ich stecke da bißchen fest. Könnt ihr mir n Anstups geben bitte ?
    Zum Testen ein Consolenprogramm:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim t As String = "[17.5,27],[18.9,31.2],[20.3,26],[20.4,24],[20.5,29.5],[20.7,19.6],[20.8,22.3],[21.2,14.8],[21.3,32.3]"
    4. Dim t1() As String = t.Split("]")
    5. Dim l As Integer = t1.Length
    6. For i As Integer = 0 To t1.Length - 2
    7. t1(i) = t1(i).Replace(",[", "[")
    8. t1(i) = t1(i).Replace(",", "0")
    9. t1(i) = t1(i).Replace(".", "")
    10. t1(i) = t1(i) & "0000"
    11. t1(i) = t1(i).Substring(0, 11) & "]"
    12. Console.WriteLine(t1(i))
    13. Next
    14. Console.ReadLine()
    15. End Sub
    16. End Module

    Eierlein schrieb:

    Zum Testen ein Consolenprogramm:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim t As String = "[17.5,27],[18.9,31.2],[20.3,26],[20.4,24],[20.5,29.5],[20.7,19.6],[20.8,22.3],[21.2,14.8],[21.3,32.3]"
    4. Dim t1() As String = t.Split("]")
    5. Dim l As Integer = t1.Length
    6. For i As Integer = 0 To t1.Length - 2
    7. t1(i) = t1(i).Replace(",[", "[")
    8. t1(i) = t1(i).Replace(",", "0")
    9. t1(i) = t1(i).Replace(".", "")
    10. t1(i) = t1(i) & "0000"
    11. t1(i) = t1(i).Substring(0, 11) & "]"
    12. Console.WriteLine(t1(i))
    13. Next
    14. Console.ReadLine()
    15. End Sub
    16. End Module


    DAS ist es ! vielen Dank.
    Habe den Code jetzt auf meine Form angepasst und funktionieren tut es bis zu dem Zeitpunkt bis ca 35 Datensätze übertragen sind.
    Danach kommt der Fehler:

    Quellcode

    1. Der Index und die Länge müssen sich auf eine Position in der Zeichenfolge beziehen.
    2. Parametername: length


    Hier mein Quellcode:

    VB.NET-Quellcode

    1. Dim dbString As String
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles convert.Click
    3. dbString = rtbQuelldaten.Text
    4. Dim t1() As String = dbString.Split("]")
    5. Dim insert As String
    6. Dim l As Integer = t1.Length
    7. For i As Integer = 0 To t1.Length - 2
    8. t1(i) = t1(i).Replace(",[", "[")
    9. t1(i) = t1(i).Replace(",", "0")
    10. t1(i) = t1(i).Replace(".", "")
    11. t1(i) = t1(i) & "0000"
    12. t1(i) = t1(i).Substring(0, 11) & "]"
    13. insert = (t1(i) & vbNewLine)
    14. rtbKonvertiert.Text = rtbKonvertiert.Text + insert
    15. Next
    16. End Sub

    Probier mal das (ist c#):

    C#-Quellcode

    1. public class Block
    2. {
    3. public Block(string pFirst,string pSecond,string pThird,string pFourth)
    4. {
    5. this._first = pFirst;
    6. this._second = pSecond;
    7. this._third = pThird;
    8. this._fourth = pFourth;
    9. }
    10. private string _first;
    11. private string _second;
    12. private string _third;
    13. private string _fourth;
    14. public static implicit operator Block(string pInput)
    15. {
    16. string[] lItems = pInput.Split(',');
    17. string lFirst = string.Empty;
    18. string lSecond = string.Empty;
    19. string lThird = string.Empty;
    20. string lFourth = string.Empty;
    21. if (lItems[0].Contains('.'))
    22. {
    23. string[] lSplitted = lItems[0].Split('.');
    24. lFirst = lSplitted[0].PadRight(2,'0');
    25. lSecond = lSplitted[1].PadRight(2,'0');
    26. }
    27. else
    28. {
    29. lFirst = lItems[0].PadRight(2, '0');
    30. lSecond = "00";
    31. }
    32. if (lItems[1].Contains('.'))
    33. {
    34. string[] lSplitted = lItems[1].Split('.');
    35. lThird = lSplitted[0].PadRight(2, '0');
    36. lFourth = lSplitted[1].PadRight(4,'0');
    37. }
    38. else
    39. {
    40. lThird = lItems[1].PadRight(2, '0');
    41. lFourth = "0000";
    42. }
    43. return new Block(lFirst, lSecond, lThird, lFourth);
    44. }
    45. public static IEnumerable<Block> ParseFromString(string pInput)
    46. {
    47. string[] allItems = pInput.Split(new string[] { "[", "]" }, StringSplitOptions.None);
    48. for (int i = 1;i < allItems.Length; i += 2)
    49. {
    50. yield return allItems[i];
    51. }
    52. }
    53. public override string ToString()
    54. {
    55. return string.Concat(this._first,this._second,this._third,this._fourth);
    56. }
    57. }


    C#-Quellcode

    1. private void button1_Click(object sender, EventArgs e)
    2. {
    3. string lInput = "[17.5,27],[18.9,31.2],[20.3,26],[20.4,24],[20.5,29.5],[20.7,19.6],[20.8,22.3],[21.2,14.8],[21.3,32.3]";
    4. IEnumerable<Block> lBlocks = Block.ParseFromString(lInput);
    5. foreach (Block lItems in lBlocks)
    6. {
    7. MessageBox.Show(lItems.ToString());
    8. }
    9. }

    Overload84 schrieb:

    [18.9,31.2] -> [18.90,31.2000] -> [1890312000]
    Diese Herangehensweise ist falsch.
    "[18.9,31.2]" -> {18.9,31.2} -> {1890,3120} -> "1890" & "3120" & "00" -> "1890312000"
    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!

    Overload84 schrieb:

    Ich sehe aber nicht wo der Fehler liegt
    1. Aus dem String machst Du per Split an "[", "]" Zahlengruppen =>
      17.5,27
      18.9,31.2
      20.3,26
      ...
    2. Jede dieser Gruppen splittest Du am "," =>
      18.9
      31.2
    3. Diese Strings wandelst Du mit Encoding "en-US" in Double-Werte:
      18.9
      31.2
    4. Diese Double-Werte multiplizierst Du mit 100:
      1890
      3120
    5. Diese Double-Werte gibst Du in einem formatierten String aus:
      txt = x.ToString & y.ToString & "00"
    6. Feddich.
    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!