Stringformatierung

  • C#

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von mikeb69.

    Stringformatierung

    Hallo,

    folgendes Problem.

    Ich hab Strings, wie z.B. "100" oder "0" oder "10" oder irgendwas in dieser Art.
    Ich muss die Strings nun dynamisch mit einem Komma ausstatten.
    Die Position des Kommas wird variieren.

    Beispiel:

    "100" - Komma 2 Stellen -> soll 1,00
    "1" - Komma 1 Stelle -> soll 0,1
    "0" Komma 1 Stelle -> soll 0,0

    Der Ansatz war den Wert mit 10^x zu Teilen und dann über String.Format ("{0:###.##}") zu formatieren.

    Das klappt aber mit einer "0" und Kommastellen nicht, Division by Zero !

    Hat jemand hierzu eine einfache Lösung ?

    Gruss

    mikeb69
    Meine Idee waere etwas derartiges mit String.Insert:

    VB.NET-Quellcode

    1. Private Function InsertComma(ByVal var As String) As String
    2. Return var.Insert(1, If(var.Length = 1, ",0", ","))
    3. End Function
    4. Private Function InsertComma(ByVal var As String, ByVal position As Integer) As String
    5. var.Insert(position, ",")
    6. If var.EndsWith(",") Then
    7. var &= "0"
    8. End If
    9. Return var
    10. End Function

    And i think to myself... what a wonderfuL World!

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

    Beim Format gilt folgendes: Jede '0' ist eine zwingend vorhandene Stelle, ein '#' nimmt so viele Stellen wie möglich.
    Also macht '#00.00' aus 2746.364 "2746.36" und aus 1.642 "01.64", außerdem aus 353.1 "353.10"
    Da ich nicht weiß, was das genaue Prinzip bei deiner variablen Dezimalzeichenstellung sein soll, kann ich mit dem Teil jetzt nicht ganz weiterhelfen.

    mikeb69 schrieb:

    Die Position des Kommas wird variieren.
    Meinst Du damit eine Multiplikation mit bzw. Division durch 10^n?
    Gibt es dafür eine Regel?
    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

    es gibt keine Regel, außer dass es sich im Rahmen 1 bis 3 Stellen vor und nach dem Komma beschränkt.
    Vor dem Komma ist mir egal.

    Beispiele

    Zahl
    Kommastellen
    Darstellung
    100
    2
    1,00m
    2
    1
    0,2kg
    0
    20,00€
    5000
    3
    5,000g

    Mein erster Ansatz war das Teilen durch 10^n und dann formatieren über das Beispiel von @nafets .
    Nur - Teilen durch 0 ist blöd.
    Hatte auf eine andere Idee gehofft.

    Edit:
    Beispiel 2 korrigiert.

    Gruss

    mikeb69

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

    @mikeb69 Da wäre aber die zweite Zeile falsch:
    Eine Nachkommastelle und 0,20kg.
    Irgendwo fehlt da eine Information:
    Du hast einen Wert und eine Anzahl Nachkommastellen. Woher aber weißt Du, wo das Komma hinkommt?
    Wenn das klar ist, kannst Du Dir einen Formatstring generieren, der die entsprechenden Stellen produziert:

    VB.NET-Quellcode

    1. Dim Kommastellen = 2
    2. Dim Wert = 42
    3. Dim fmt = String.Format("{{0:N{0}}}", Kommastellen)
    4. Dim Ausgabe = String.Format(fmt, Wert)

    ====
    Formatstring korrigiert
    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!
    Hallo,

    hier meine Lösung

    C#-Quellcode

    1. public static string InsertComma(this string value, int position)
    2. {
    3. double ret = value != "0" ? Convert.ToDouble(value) / Convert.ToDouble(Math.Pow(10, position)) : 0;
    4. switch (position)
    5. {
    6. case 1:
    7. return string.Format("{0:##0.0}", ret);
    8. case 2:
    9. return string.Format("{0:##0.00}", ret);
    10. default:
    11. return string.Format("{0:##0.000}", ret);
    12. }
    13. }


    Edit:
    @RodFromGermany

    hab deinen Beitrag zu spät gesehen.
    Genau so etwas hab ich eigentlich gesucht.

    Gruss und Danke

    mikeb69

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