none
Salto de linea sin cortar palabras RRS feed

  • Pregunta

  • Estoy usando el código que se facilita en todo el Internet para usar impresoras térmicas, pero esto me genera un problema debido al limite de caracteres, en este caso son 32 caracteres por linea de los cuales 14 son para la descripción y es donde yace el problema.

    El código donde esta la parte especifica del problema es el siguiente: 

    //Metodo para agreagar articulos al ticket de venta
    public void AgregaArticulo(string articulo, int cant, string precio, string total)
        {
            //Valida que cant precio e total esten dentro del rango.
            if (cant.ToString().Length <= 5 && precio.ToString().Length <= 7 && total.ToString().Length <= 6)
                {
                    string elemento = "", espacios = "";
                    bool bandera = false;//Indicara si es la primera linea que se escribe cuando bajemos a la segunda si el nombre del articulo no entra en la primera linea
                    int nroEspacios = 0;
    
                    //Si el nombre o descripcion del articulo es mayor a 14, bajar a la siguiente linea
                    if (articulo.Length > 14)
                        {
                            //Colocar la cantidad a la derecha.
                            nroEspacios = (5 - cant.ToString().Length);
                            espacios = "";
                            for (int i = 0; i < nroEspacios; i++)
                                {
                                    espacios += " ";//Generamos los espacios necesarios para alinear a la derecha
                                }
                            elemento += espacios + cant.ToString();//agregamos la cantidad con los espacios
    
                            //Colocar el precio a la derecha.
                            nroEspacios = (7 - precio.ToString().Length);
                            espacios = "";
                            for (int i = 0; i < nroEspacios; i++)
                                {
                                    espacios += " ";//Genera los espacios
                                }
                            //el operador += indica que agregar mas cadenas a lo que ya existe.
                            elemento += espacios + precio.ToString();//Agregamos el precio a la variable elemento
    
                            //Colocar el total a la derecha.
                            nroEspacios = (6 - total.ToString().Length);
                            espacios = "";
                            for (int i = 0; i < nroEspacios; i++)
                                {
                                    espacios += " ";
                                }
                            elemento += espacios + total.ToString();//Agregamos el total alineado a la derecha
    
                            int caracterActual = 0;//Indicara en que caracter se quedo al bajae a la siguiente linea
                                            
                            //Por cada 14 caracteres se agregara una linea siguiente
                            for (int longitudTexto = articulo.Length; longitudTexto > 14; longitudTexto -= 14)
                                {
                                    if (bandera == false)//si es false o la primera linea en recorrerer, continuar...
                                        {
                                            //agregamos los primeros 14 caracteres del nombre del articulos, mas lo que ya tiene la variable elemento
                                            linea.AppendLine(articulo.Substring(caracterActual, 14) + elemento);
                                            bandera = true;//cambiamos su valor a verdadero
                                        }
                                    else
                                        linea.AppendLine(articulo.Substring(caracterActual, 14));//Solo agrega el nombre del articulo
    
                                    caracterActual += 14;//incrementa en 14 el valor de la variable caracterActual
                                }
                                            
                            //Agrega el resto del fragmento del  nombre del articulo
                            linea.AppendLine(articulo.Substring(caracterActual, articulo.Length - caracterActual));
    
                        }
                    else //Si no es mayor solo agregarlo, sin dar saltos de lineas
                        {
                            for (int i = 0; i < (14 - articulo.Length); i++)
                                {
                                    espacios += " "; //Agrega espacios para completar los 14 caracteres
                                }
                            elemento = articulo + espacios;
    
                            //Colocar la cantidad a la derecha.
                            nroEspacios = (5 - cant.ToString().Length);// +(14 - elemento.Length);
                            espacios = "";
                            for (int i = 0; i < nroEspacios; i++)
                                {
                                    espacios += " ";
                                }
                            elemento += espacios + cant.ToString();
    
                            //Colocar el precio a la derecha.
                            nroEspacios = (7 - precio.ToString().Length);
                            espacios = "";
                            for (int i = 0; i < nroEspacios; i++)
                                {
                                    espacios += " ";
                                }
                            elemento += espacios + precio.ToString();
    
                            //Colocar el total a la derecha.
                            nroEspacios = (6 - total.ToString().Length);
                            espacios = "";
                            for (int i = 0; i < nroEspacios; i++)
                                {
                                    espacios += " ";
                                }
                            elemento += espacios + total.ToString();
    
                            linea.AppendLine(elemento);//Agregamos todo el elemento: nombre del articulo, cant, precio, importe.
                        }
                }
            else
                {
                    linea.AppendLine("Los valores ingresados para esta fila");
                    linea.AppendLine("superan las columnas soportdas por éste.");
                    throw new Exception("Los valores ingresados para algunas filas del ticket\nsuperan las columnas soportdas por éste.");
                }                       
        }

    Resalte  en negritas la parte exacta (en el código ya mostrado) donde reside el problema que planteare a continuación.

    

    Al hacer mi cobro imprimo un ticket, en el cual quiero hacer que no se corten las palabras como por ejemplo lo que hizo con:

    "ORDEN PARA LLEVAR"

    Que en este caso hizo esto:

    "ORDEN PARA LLE

    VAR"

    En este caso cada 14 caracteres lo tengo para que de el salto de linea y no tope con la demás información de la derecha pero esto me esta cortando palabras, y es eso lo que quiero corregir.

    De antemano gracias por la atención prestada.



    • Editado EAAH domingo, 21 de abril de 2019 18:31
    sábado, 20 de abril de 2019 17:27

Respuestas

  • Esencialmente el algoritmo sería este: Tomas el string, y comienzas a examinar los caracteres uno por uno partiendo de la posición 15 y hacia atrás. En el momento en que encuentras un espacio en blanco, te quedas con el número de la posición menos uno (por ejemplo, en "ORDEN PARA LLEVAR" sería la 10) y entonces usas ese número en lugar del 14 para cortar el string en la misma forma en la que lo estás haciendo actualmente.

    Tendrás que meter algunos "if" para considerar los casos particulares como por ejemplo que no exista ningún espacio en blanco en los primeros 14 caracteres, en cuyo caso no tendrás más remedio que cortar la palabra.

    lunes, 22 de abril de 2019 8:14
    Moderador