Stringa di formato con i trattini
-
09-10-2019 - |
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?
Soluzione
Regex.Replace("410151000640", @"^(.{2})(.{2})(.{2})(.{3})(.{3})$", "$1-$2-$3-$4-$5");
o la versione leggermente più corta ??p>
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.