Zahl trennen

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Nikx.

    Hallo,
    ich würde gerne eine Zahl von hinten nach vorne alle drei Stellen teilen und anschließend in eine ListBox einfügen. Das Problem ist: ich habe keine ahnung wie ich zahlen von hinten trennen kann.
    Danke für eure mithilfe.

    -- Marcel
    Kurz selbst gebastelt in C#:

    C#-Quellcode

    1. int[] SplitInteger(int number)
    2. {
    3. List<int> numbers = new List<int>();
    4. while (number > 999)
    5. {
    6. int rightNumber = number % 1000; // Modulo, ermittelt die rechten drei Ziffern
    7. numbers.Add(rightNumber);
    8. number = number / 1000;
    9. }
    10. numbers.Add(number);
    11. return numbers.ToArray();
    12. }

    Ich hab mir dafür mal eine Funktion geschrieben, die generelle IEnumerable(Of T) aufteilen kann. Das würde dann so aussehen:

    VB.NET-Quellcode

    1. Dim WholeNumber = DieZahl.ToString
    2. Dim Parts = WholeNumber.SliceToSizeRightAligned(SliceSize := 3, SkipRemainder := False).Select(Function(i) New String(i.ToArray))

    Aber das ist leider nicht ganz trivial. In C# wär's wahrscheinlich leichter, denn da gibt's Yield Return.

    Für einfache Strings dürfte aber sowas reichen:

    VB.NET-Quellcode

    1. Const SliceSize = 3
    2. Dim WholeNumber = DieZahl.ToString 'Z.B.: "12345678"
    3. Dim Slices As New List(Of String)
    4. 'Irgendwie geht das noch zu vereinfachen, hab aber nicht mehr im Kopf wie.
    5. Dim FirstSliceLength = WholeNumber.Length Mod SliceSize 'Im Beispiel 2
    6. If FirstSliceLength = 0 Then
    7. FirstSliceLength = SliceSize
    8. End If
    9. 'Der erste Teil ist das, was übrig bleibt, wenn der ganze String nicht gleichmäßig aufgeteilt werden kann. Ansonsten gleich groß wie die anderen Teile. Im Beispiel "12"
    10. Slices.Add(WholeNumber.Substring(0, FirstSliceLength))
    11. 'Sind noch mehr Teile übrig, werden die ebenfalls rausgepickt. Im Beispiel "345" und "678"
    12. For Index = FirstSliceLength To WholeNumber.Length - 1 Step SliceSize
    13. Slices.Add(WholeNumber.Substring(Index, SliceSize))
    14. Next
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

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

    Marceliboy schrieb:

    in 3er Gruppen
    Meinst Du so was:

    VB.NET-Quellcode

    1. Dim prov = New CultureInfo("de-DE", False).NumberFormat
    2. prov.NumberGroupSeparator = "'"
    3. Dim Val = 1000000000000000D
    4. Dim txt = Val.ToString("N", prov)
    5. MessageBox.Show(txt)
    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!
    Hej @Marceliboy

    Nimm doch den String txt aus @RodFromGermanys Beispiel und splitte ihn dann am '.

    Ansonsten, wie wäre es so?

    VB.NET-Quellcode

    1. Dim Number As Integer = 1234567890
    2. Dim NumberString As String = Number.ToString
    3. While Not NumberString.Length Mod 3 = 0 'Solange man die Zahl nicht in genau 3 Ziffern große Teile aufteilen kann...
    4. NumberString = " " & NumberString '...erweitern wie sie vorne einfach um Leerzeichen.
    5. End While
    6. Dim NumberPairs As New List(Of Char())
    7. Dim Pairs As Integer = NumberString.Length \ 3 'Anzahl an 3er-Paaren berechnen. Hier: 4.
    8. For i = 0 To Pairs - 1
    9. NumberPairs.Add(NumberString.ToCharArray(i * 3, 3)) 'Immer 3 Ziffern lange Teilarrays erstellen.
    10. Next
    11. For Each CharPair As Char() in NumberPairs.ToArray.Reverse() 'Die Zahl (in ihren Teilen) umdrehen...
    12. ListBox1.Items.Add(New String(CharPair)) '...und die Teile hinzufügen.
    13. Next

    Erzeugt als Output:

    Quellcode

    1. 1
    2. 234
    3. 567
    4. 890


    Grüße
    Väinämö

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Vainamo V“ ()

    Was

    Marceliboy schrieb:

    Nicht ganz.
    :?:
    Was Du damit machst, ist doch sekundär. Wo die herkommen / wie sie generiert werden ist wichtig.
    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!

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Zahl As String = TextBox1.Text
    3. Dim reachedThree As Integer = 0
    4. Dim temp As String = ""
    5. For i As Integer = 0 To Zahl.Length - 1 Step 1
    6. temp += Zahl(i)
    7. reachedThree += 1
    8. If (reachedThree = 3) Then
    9. reachedThree = 0
    10. ListView1.Items.Add(temp)
    11. temp = ""
    12. End If
    13. Next
    14. ListView1.Items.Add(temp)
    15. End Sub


    In der Praxis:
    EMPIRE BUSINESS
    Oder so und umgedreht:

    VB.NET-Quellcode

    1. Dim listNum As New List(Of String)
    2. 'der Zahlenstring wird nach Hunderterschritten (3 Stellen) von hinten nach vorne zerlegt und in einer Liste abgelegt
    3. Dim tmpNr = number.ToString
    4. For i = tmpNr.Length To 0 Step -3
    5. Dim tmp = tmpNr.Substring(If(i < 3, 0, i - 3), If(i < 3, i, 3))
    6. If Not String.IsNullOrEmpty(tmp) Then listNum.Add(tmp)
    7. Next

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

    @.prox Jo, dein Ergebnis ist aber leider falsch, weil es 7.XXX.XXX sein müsste, anstatt 7XX.XXX.X.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Das ist schon mal nicht schlecht. (Danke schonmal :) )
    Jetzt möchte ich allerdings noch in eine zweite Spalte Text reinschreiben.
    Ich habe aber leider keine Ahnung wie ich das programmieren könnte weil der Text zudem auch noch unterschiedlich sein soll.
    Genauer seht ihr es im Bild
    Bilder
    • Unbenannt.png

      1,99 kB, 145×148, 687 mal angesehen
    Woran scheitert es?
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Hi,
    das beantwortet meine Frage nur zu 50%. Da verweise ich doch liebend gern direkt auf meinen Thread zum Thema :D
    Grundlagen der Forennutzung und warum der Hilfreich-Button kein Stacheldraht ist
    Absatz 2, d) e) und f).

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!