Herausfinden, wie viele Stellen eine Zahl hat

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Herausfinden, wie viele Stellen eine Zahl hat

    Moin... irgendwie habe ich gerade eine leichte Blockade.

    Ich habe zwei Zahlen, einmal den Count einer Liste und einmal das aktuelle Element (anhand einer Zahl)

    bspw. Count 125, aktuelles Element ist das erste, oder 17.te, oder 112.te und so weiter.

    Die Ergebnisse eines durchlaufens der Liste werden am Ende numeriert ausgegeben, es soll ein einfaches Formatierungstool sein.

    Sprich bei Count 30 z.B. sollte es so aussehen:

    01
    02
    03
    04
    ...
    30

    Bei 125, wie aktuell so:

    001
    002
    003
    ...
    045
    046
    047
    ...
    125


    Eine Sub bekommt von mir als Referenz den String, welcher so am Ende aussehen soll, den aktuellen Index sowie den maximalen Count.

    Visual Basic-Quellcode

    1. Private Sub MakeNumber(ByRef inputStr As String, index As Integer, count As Integer)
    2. Dim zeros As Integer = 0
    3. While Not (CInt(count / 10)) < 10
    4. zeros += 1
    5. count = CInt(count / 10)
    6. End While
    7. Dim oldId As Integer = index
    8. Dim zerosIndex As Integer = 0
    9. While Not (CInt(index / 10)) < 10
    10. zeros += 1
    11. index = CInt(index / 10)
    12. End While
    13. Dim realZeros As Integer = zeros - zerosIndex
    14. For i As Integer = 0 To realZeros
    15. inputStr += "0"
    16. Next
    17. inputStr += oldId.ToString
    18. End Sub


    Natürlich funktioniert es nicht ganz...

    (Ich habe:

    001
    002
    003
    ...
    0030
    0031
    0032
    ...
    000101
    000102
    000103
    ...
    )

    Ich komme gerade echt nicht dahinter, wo meine Logik falsch ist bzw. wo mein Denkfehler liegt...
    Ich versuche durch die Schleifen herauszufinden, wie viele Stellen eine Zahl hat, indem ich sie immer wieder durch 10 Teile, und subtrahiere am Ende, um die Differenz dessen heraus zu finden... Zumindest habe ich das vor, aber irgendwas stimmt da nciht... und komme leider nicht drauf im Moment.

    Weis da einer Rat oder hat einen Tipp?

    Edit: Hat sich erledigt ._.

    Int.ToString.Length...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Kagurame“ () aus folgendem Grund: Lösung gefunden

    Wusste nicht dass das geht und auch nie geschaut, ob die ToString Overloads hat. Ansonsten sollten es ja maximal so viele Stellen sein, wie der höchste Wert hat.

    Also ("000") würde dann bei Dreistelligen Zahlen richtig sein, aber bei zwei- oder vier-Stelligen nicht mehr...
    Hab nun einfach die Werte in Strings umgewandelt (als was sie sowieso gebraucht werden) und dann die Length verglichen.
    Also einen Format-String, der aus sovielen "0" besteht, wie die längste Zahl lang ist.
    Da gibt es ganz sicher einen schicken LINQ-Ausdruck für, also lasse ich meinen 3-Zeiler weg. :D
    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!

    picoflop schrieb:

    math.log(maxcount)
    Suboptimal, das kann in Grenzfällen schiefgehen:
    9.99999999... könnte er als 10 deuten oder nicht.
    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!
    ToString hat doch noch einige Overloads resp. Formatierungsangaben mehr.
    Das hier sollte Deinem gewünschten Ergebnis recht nahe kommen:

    VB.NET-Quellcode

    1. Private Sub MakeNumber(ByRef inputStr As String, index As Integer, count As Integer)
    2. inputStr = index.ToString(String.Format("D{0}", count.ToString.Length))
    3. End Sub
    Dann werf' ich mal meine Methode in den Raum:

    VB.NET-Quellcode

    1. Dim i As Integer = 12 'Der umzuwandelnde Wert
    2. Dim MaxValue As Integer = 123 'Der Maximalwert
    3. Dim Result As String = i.ToString.PadLeft(MaxValue.ToString.Length, "0"c)

    MaxValue.ToString -> "123"
    MaxValue.ToString.Lenght -> 3
    i.ToString = "12"
    i.ToString.PadLeft(MaxValue.ToString.Lenght, "0"c) -> "012"

    .PadLeft() hängt wenn erforderlich das angegebene Zeichen so lange links dran, bis die gesamte Zeichenfolge so lang ist, wie der angegebene Wert.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    picoflop schrieb:

    und nicht in vb-Tags ...
    Ich hatte auch solch Code in Überlegung. Das mit dem ToString und Stellen abzählen missfällt mir auch.
    Da ist die Lösung von @Niko Ortner: bis jetzt die beste. :thumbup:
    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!