2010-10-19 14 views
6

Ho un valore di stringa compresso che sto estraendo da un file di importazione. Ho bisogno di formattarlo in un numero di pacco, che è formattato come segue: ##-##-##-###-###. Pertanto, la stringa "410151000640" dovrebbe diventare "41-01-51-000-640". Posso farlo con il seguente codice:Stringa di formato con trattini

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

Tuttavia, la stringa potrebbe non essere tutti i numeri; potrebbe avere una o due lettere lì dentro, e quindi la conversione in int fallirà. C'è un modo per farlo su una stringa in modo tale che ogni carattere, indipendentemente dal fatto che si tratti di un numero o di una lettera, si adatterà correttamente al formato?

risposta

19
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"); 
+0

Funziona come un fascino! Ho estratto questo in un metodo wrapper con alcune convalida e gestione degli errori. Grazie! – Kevin

+0

Devo davvero imparare il Regex correttamente. Una buona soluzione a questo problema. –

+1

@ Øyvind Se aiuta, mi piace usare http://www.regular-expressions.info/tutorial.html come riferimento. Parlano anche dei diversi sapori di regex forniti da diversi motori. –

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.

EDIT

ora appena visto che non hai avuto trattini tra ogni secondo numero tutto il senso, per ciò richiederà un piccolo ritocco (e lo rende un po 'più goffo anche ho paura)

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

Mi avvicinerei a questo con il tuo metodo di formattazione, purché tu sappia che il "Numero pacco" è 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)); 
} 
0

Se capisco che stai cercando una funzione che rimuove 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 
+0

No, anche le lettere sono incluse nel numero del pacco, ad esempio "410151000vb6" dovrebbe diventare "41-01-51-000-vb6" – Kevin

1

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(); 
+0

Non dovrebbe il 'a' nella maschera essere '&'? 'a' è alfanumerico, facoltativo. Gli unici caratteri che accetterà sono le lettere ASCII a-z e A-Z. http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.mask.aspx –

Problemi correlati