Frage

habe ich einen komprimierten String Wert I aus einer Importdatei bin extrahieren. Ich brauche diese in eine Paketnummer zu formatieren, die wie folgt formatiert ist: ##-##-##-###-###. So also die Zeichenfolge „410151000640“ sollte „41-01-51-000-640“ werden. Ich kann dies tun mit dem folgenden Code:

String.Format("{0:##-##-##-###-###}", Convert.ToInt64("410151000640"));

Allerdings Der String kann nicht alle Zahlen sein; es könnte ein oder zwei Buchstaben drin haben und damit die Umstellung auf den int fehl. Gibt es eine Möglichkeit, dies auf einer Schnur zu tun, damit jedes Zeichen, unabhängig davon, ob es sich um eine Zahl oder einen Buchstaben ist, richtig in das Format passen?

War es hilfreich?

Lösung

Regex.Replace("410151000640", @"^(.{2})(.{2})(.{2})(.{3})(.{3})$", "$1-$2-$3-$4-$5");

Oder die etwas kürzere Version

Regex.Replace("410151000640", @"^(..)(..)(..)(...)(...)$", "$1-$2-$3-$4-$5");

Andere Tipps

Ich würde diesen Ansatz, indem Sie Ihre eigene Formatierung Verfahren mit, solange Sie wissen, dass die „Paketnummer“ immer Konform einer bestimmten Regel.

public static string FormatParcelNumber(string input)
{
  if(input.length != 12)
     throw new FormatException("Invalid parcel number. Must be 12 characters");

  return String.Format("{0}-{1}-{2}-{3}-{4}",
                input.Substring(0,2),
                input.Substring(2,2),
                input.Substring(4,2), 
                input.Substring(6,3), 
                input.Substring(9,3));
}

Dies sollte in Ihrem Fall:

string value = "410151000640";
for( int i = 2; i < value.Length; i+=3){
  value = value.Insert( i, "-");
}

Jetzt value enthält die Zeichenfolge mit eingesetztem Bindestrich.

Bearbeiten

Ich sehe gerade jetzt, dass Sie keine Bindestriche haben zwischen jeder zweiten Reihe des ganzen Weg, um dies eine kleine zwicken erfordern (und mache es ein bisschen mehr plump auch Angst, ich bin)

string value = "410151000640";
for( int i = 2; i < value.Length-1; i+=3){
  if( value.Count( c => c == '-') >= 3) i++;
  value = value.Insert( i, "-");
}

Wenn sein Teil UI können Sie verwenden MaskedTextProvider in System.ComponentModel

    MaskedTextProvider prov = new MaskedTextProvider("aa-aa-aa-aaa-aaa");
    prov.Set("41x151000a40");
    string result = prov.ToDisplayString();

Wenn ich understodd Sie richtig youre die Suche nach einer Funktion, die alle Buchstaben aus einem String entfernt, nicht wahr?

Ich habe dies im laufenden Betrieb erstellt, vielleicht können Sie es in c # konvertieren, wenn es ist, was Sie suchen:

Dim str As String = "410151000vb640"
str = String.Format("{0:##-##-##-###-###}", Convert.ToInt64(MakeNumber(str)))


Public Function MakeNumber(ByVal stringInt As String) As String
    Dim sb As New System.Text.StringBuilder
    For i As Int32 = 0 To stringInt.Length - 1
        If Char.IsDigit(stringInt(i)) Then
            sb.Append(stringInt(i))
        End If
    Next
    Return sb.ToString
End Function

Hier ist eine einfache Erweiterung Methode mit einigem Dienstprogramm:

    public static string WithMask(this string s, string mask)
    {
        var slen = Math.Min(s.Length, mask.Length);
        var charArray = new char[mask.Length];
        var sPos = s.Length - 1;
        for (var i = mask.Length - 1; i >= 0 && sPos >= 0;)
            if (mask[i] == '#') charArray[i--] = s[sPos--];
            else
                charArray[i] = mask[i--];
        return new string(charArray);
    }

Verwenden Sie es wie folgt:

        var s = "276000017812008";
        var mask = "###-##-##-##-###-###";
        var dashedS = s.WithMask(mask);

Sie können es verwenden, um mit einer beliebigen Zeichenfolge und jedem anderen Zeichen als # in der Maske eingefügt wird. Die Maske wird von rechts nach links arbeiten. Sie können es zwicken den anderen Weg zu gehen, wenn Sie wollen.

Haben Sie Spaß.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top