Domanda

Ho un valore stringa compressa sto estrarre da un file di importazione. Ho bisogno di formattare questo in un numero del pacco, che è formattato come segue: ##-##-##-###-###. Così dunque, la stringa "410151000640" dovrebbe diventare "41-01-51-000-640". Posso fare questo con il seguente codice:

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

Tuttavia, la stringa può non essere tutti i numeri; potrebbe avere una lettera o due in là, e quindi la conversione all'int fallirà. C'è un modo per fare questo su una stringa in modo ogni personaggio, a prescindere se si tratta di un numero o una lettera, si inserisce correttamente nel formato?

È stato utile?

Soluzione

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

o la versione leggermente più corta

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

Altri suggerimenti

Vorrei affrontare questo per avere il proprio metodo di formattazione, fino a quando si sa che il "Parcel numero" sempre conforme a una regola specifica.

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));
}

Questo dovrebbe funzionare nel vostro caso:

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

Ora value contiene la stringa con i trattini inseriti.

Modifica

ho appena ha visto che non c'era bisogno trattini tra ogni secondo numero tutto il senso, per ciò richiederà un piccolo ritocco (e lo rende un po 'più goffo anche temo)

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

Se parte della UI suo è possibile utilizzare MaskedTextProvider in System.ComponentModel

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

Se i understodd si correttamente siete alla ricerca di una funzione che elimina tutte le lettere da una stringa, non è vero?

Ho creato questo al volo, forse si può convertire in c # se è quello che stai cercando:

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

Ecco un metodo semplice estensione con una certa utilità:

    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);
    }

Usa come segue:

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

È possibile utilizzare con qualsiasi stringa e qualsiasi carattere diverso da # nella maschera verrà inserito. La maschera funzionerà da destra a sinistra. È possibile modificarlo per andare nella direzione opposta, se si desidera.

Buon divertimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top