none
Recortar caracteres de un string String RRS feed

  • Pregunta

  • He estado mirando en la librería de msdn que para recortar caracteres se utiliza la propiedad REMOVE que dado un índice y la cantidad de caracteres a remover, los tendría que quitar.

     

    Todo bien hasta el momento sin embargo en mi caso no siempre se cuantos caracteres me sobran es decir tengo la cadena:

    P0047347_001_004

    P0047347_001_0

    P004734704

     

    y lo que yo necesito es solamente los primeros 8 es decir P0047347 por decir un ejemplo.

    Yo tengo mi código de esta forma:

     

     

    nodoArchivo.Text = Path.GetFileNameWithoutExtension(nombreArchvo.FullName).Remove(8, 8);

     

    Me funciona solamente cuando mi string se encuentra de esta forma:

    P0047347_001_004

    Pero me presenta un error o información equivocada cuando el string esta de esta forma

    P0047347_001_0

    P0047347_04

    Existe otra forma de indicarle solo me tome en Cuente los primeros 8 y lo demás ya no los tome.

    De antemano gracias por su ayuda...


    HB
    martes, 8 de noviembre de 2011 17:34

Respuestas

  • hola

    string cadena = "P0047347_001_004";
    
    string resultado = cadena.Substring(0, 8);
    
    

     

    es directo solo obtienes los 8 primeros

    Substring

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta HB System martes, 8 de noviembre de 2011 18:58
    martes, 8 de noviembre de 2011 18:18
  • Y de hecho si solo te interesan digitos, el codigo pudiera simplificarse aun mas de la siguiente forma:

    private void button1_Click(object sender, EventArgs e)
            {
                string cadena = "P0047347_001_004";
                MessageBox.Show(devuelveOcho(cadena));
            }
            string devuelveOcho(string cadena)
            {    
                string cadenaAux = "";
    
                Regex.Replace(cadena, "[^0-9]", "").Take(8).ToList().ForEach(delegate(char c) {
                    cadenaAux += c.ToString();
                });
    
                return cadenaAux;
            }
    

    Si te fijas, desde la expresión regular se realiza el filtro para tomar en cuenta solo numeros. Con lo cual nos ahorramos un poco de linQ.

     

    saludos amigo..

    ----------------------------

    Si te sirve alguna respuesta no olvides marcarla como tal o votarla.

     

     

    • Marcado como respuesta HB System martes, 8 de noviembre de 2011 19:00
    martes, 8 de noviembre de 2011 18:31

Todas las respuestas

  • hola

    y si haces

    string cadena = "P0047347_001_004";
    
    string[] partes  cadena.Split('_');
    
    if(partes.Length >= 1){
    
        string resultado = partes[0];
    
    }
    


    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 8 de noviembre de 2011 17:42
  • Gracias Leando por tu ayuda,

    podrias indicarme un mejor ejemplo, de lo que mencionas muhas gracias.


    HB
    martes, 8 de noviembre de 2011 17:46
  • mejor ejemplo, pero si es algo cortito, la tecnica es usar el Split() de un string, en este caso por el "_"

    solo eso, no hay muchas mas magia que esa

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 8 de noviembre de 2011 17:53
  • Gracias Leandro por tu tiempo y tu respuesta.

     

    Deja explicarlo una vez más tengo

     

    nodoArchivo.Text tiene un string sin embargo no se qué tamaño tiene pero yo solo necesito los primero 8 dígitos

     

    Puede que estén de esta forma

     

    P0047347_001_004

     

    P0045347_001_0

     

    P004434704458

     

    P004834704568

     

    Algunos traen _ y otros no pero solo necesito los primero 8 dígitos de esa cadena.

     

    Yo le estaba asiendo de esta forma pero me causo error.

     

    nodoArchivo.Text = Path.GetFileNameWithoutExtension(nombreArchvo.FullName).Remove(8, 8);

     

    Gracias de antemano.

     


    HB
    martes, 8 de noviembre de 2011 18:06
  • hola

    string cadena = "P0047347_001_004";
    
    string resultado = cadena.Substring(0, 8);
    
    

     

    es directo solo obtienes los 8 primeros

    Substring

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    • Marcado como respuesta HB System martes, 8 de noviembre de 2011 18:58
    martes, 8 de noviembre de 2011 18:18
  • Que tal amigo, prueba esto:

    private void button1_Click(object sender, EventArgs e)
            {
                string cadena = "P0047347_001_004";
                MessageBox.Show(devuelveOcho(cadena));
            }
            string devuelveOcho(string cadena)
            {
                string soloAlfaNumericos = Regex.Replace(cadena, "[^a-zA-Z0-9]", "");
    
                List<char> lista =
                               (from c in soloAlfaNumericos
                               where Char.IsDigit(c)
                               select c).Take(8).ToList();
    
                string cadenaAux = "";
    
                lista.ForEach(delegate(char c) {
                    cadenaAux += c.ToString();
                }
                );
    
                return cadenaAux;
            }
    

    En este caso te devuelve 8 DIGITOS; si quisieras devolver tambien LETRAS solo cambia la linea:

    where Char.IsDigit(c) por: where Char.IsLetterOrDigit(c)

    ----------------------------

    Si te sirve alguna respuesta no olvides marcarla como tal o votarla.

    martes, 8 de noviembre de 2011 18:22
  • Y de hecho si solo te interesan digitos, el codigo pudiera simplificarse aun mas de la siguiente forma:

    private void button1_Click(object sender, EventArgs e)
            {
                string cadena = "P0047347_001_004";
                MessageBox.Show(devuelveOcho(cadena));
            }
            string devuelveOcho(string cadena)
            {    
                string cadenaAux = "";
    
                Regex.Replace(cadena, "[^0-9]", "").Take(8).ToList().ForEach(delegate(char c) {
                    cadenaAux += c.ToString();
                });
    
                return cadenaAux;
            }
    

    Si te fijas, desde la expresión regular se realiza el filtro para tomar en cuenta solo numeros. Con lo cual nos ahorramos un poco de linQ.

     

    saludos amigo..

    ----------------------------

    Si te sirve alguna respuesta no olvides marcarla como tal o votarla.

     

     

    • Marcado como respuesta HB System martes, 8 de noviembre de 2011 19:00
    martes, 8 de noviembre de 2011 18:31
  • Muchas Gracias por la respuesta fue mas simple de lo que creia

    Que tengas un excelente dia!!


    HB
    martes, 8 de noviembre de 2011 18:59
  • Gracias por tu respuesta Que tengas un excelente dia!

    Esta forma tambien me sirvio.


    HB
    martes, 8 de noviembre de 2011 19:00
  • Buen día para ti tambien!! Que bien que te haya servido de algo, y de paso todos aprendemos mas. Y fijate que aun se puede simplificar mas haciendo uso de las maravillas de linQ, aunque nuestro codigo se vuelve un poquito mas complejo:

    string devuelveOcho3(string cadena)
            {
                return ((from c in Regex.Replace(cadena, "[^0-9]", "")
                         select c).Take(8).ToList()).Aggregate("", (a, b) => a + b); 
            }
    

    saludos 

     

    ----------------------------

    Si te sirve alguna respuesta no olvides marcarla como tal o votarla.

    martes, 8 de noviembre de 2011 22:26