Pregunta

I tiene un valor de cadena comprimido que estoy extrayendo de un archivo de importación. Necesito formatear esto en un número de parcela, que tiene el formato de la siguiente manera: ##-##-##-###-###. Por lo tanto, la cadena "410151000640" debe convertirse en "41-01-51-000-640". Puedo hacer esto con el siguiente código:

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

Sin embargo, la cadena no puede ser todos los números; que podría tener una o dos letras en ese país, y por lo tanto la conversión a la int fallará. ¿Hay una manera de hacer esto en una cadena para cada personaje, independientemente de si se trata de un número o letra, se ajuste al formato correctamente?

¿Fue útil?

Solución

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

O la versión ligeramente más corto

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

Otros consejos

I se acercaría a esto por tener su propio método de formato, como siempre que se sepa que el "número de parcela" siempre se ajusta a una norma específica.

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

Esto debería funcionar en su caso:

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

Ahora value contiene la cadena con guiones insertados.

Editar

acabo de sierra que usted no tenía guiones entre cada segundo número hasta el final, para ello será necesario un pequeño pellizco (y hace que sea un poco más torpe También me 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, "-");
}

Si su parte de la interfaz de usuario se puede utilizar en MaskedTextProvider System.ComponentModel

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

Si usted i understodd correctamente estas buscando una función que elimina todas las letras de una cadena, ¿verdad?

He creado este sobre la marcha, tal vez usted puede convertirlo en C # si es lo que estás buscando:

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

Aquí es un método simple extensión con alguna utilidad:

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

Se usa de la siguiente manera:

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

Se puede utilizar con cualquier cadena y cualquier carácter distinto de # en la máscara se inserta. La máscara funcionará de derecha a izquierda. Se pueden ajustar a ir a otro lado si lo desea.

divertirse.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top