Lección 18 · 18 de 20
Textos con StrUtils y Format · Pascal
Trocee, alinee, transforme y enmascare textos con las funciones de StrUtils y los formatos de Format en Free Pascal, con una línea de un CSV.

La constante Row es una línea de un CSV separado por punto y coma. `WordCount` cuenta sus campos y `ExtractWord(n, Row, [';'])` saca el campo número n (empezando por 1); el tercer parámetro es un conjunto de separadores. StrToFloat y StrToInt convierten el precio y las existencias.
`Format` construye un texto a partir de una plantilla. %-16s reserva 16 caracteres para un texto alineado a la izquierda (el signo -), %8.2f escribe un número con dos decimales en 8 columnas alineado a la derecha y %6d hace lo mismo con un entero. %.6d rellena con ceros (000042) y %x escribe en hexadecimal, útil para colores.
`IfThen` de StrUtils elige entre dos textos según una condición, en una sola expresión. ReplaceStr y LowerCase convierten el nombre en un *slug* para una URL, y ReverseString le da la vuelta.
`ContainsText` y `StartsText` buscan sin distinguir mayúsculas de minúsculas; sus parejas ContainsStr y StartsStr sí distinguen. `DupeString` repite un texto y `RightStr` toma el final: juntos enmascaran una tarjeta dejando visibles los cuatro últimos dígitos. `PadCenter` centra un texto en un ancho dado.
Código · main.pas
program main;uses SysUtils, StrUtils;const Row = 'Wireless mouse;Peripherals;19.9;48'; Card = '4532015112830366';var name: String; price: Double; stock: Integer;begin WriteLn('Fields: ', WordCount(Row, [';'])); name := ExtractWord(1, Row, [';']); price := StrToFloat(ExtractWord(3, Row, [';'])); stock := StrToInt(ExtractWord(4, Row, [';'])); WriteLn(Format('|%-16s|%8s|%6s|', ['Product', 'Price', 'Units'])); // - aligns left WriteLn(Format('|%-16s|%8.2f|%6d|', [name, price, stock])); WriteLn(Format('%s costs %.2f; stock is %s', [name, price, IfThen(stock < 50, 'low', 'fine')])); WriteLn('Slug: ', LowerCase(ReplaceStr(name, ' ', '-'))); WriteLn('Reversed: ', ReverseString(name)); WriteLn('Mentions MOUSE: ', ContainsText(name, 'MOUSE'), ', starts with "wire": ', StartsText('wire', name)); WriteLn('Card: ', DupeString('*', 12) + RightStr(Card, 4)); WriteLn('Centred: [', PadCenter('SALE', 12), ']'); WriteLn(Format('Invoice INV-%.6d, colour #%x', [42, 16744448]));end.Salida · fpc main.pas && ./main
Fields: 4 |Product | Price| Units| |Wireless mouse | 19.90| 48| Wireless mouse costs 19.90; stock is low Slug: wireless-mouse Reversed: esuom sseleriW Mentions MOUSE: TRUE, starts with "wire": TRUE Card: ************0366 Centred: [ SALE ] Invoice INV-000042, colour #FF8000
Para recordar
ExtractWordyWordCounttrocean por los separadores que usted elija.- En
Format,%-16salinea a la izquierda y%8.2fa la derecha. %.6drellena con ceros y%xescribe en hexadecimal.- Las funciones
...Textno distinguen mayúsculas; las...Str, sí. IfThenelige entre dos textos en una expresión.
Ejercicio
Añada una segunda línea CSV con otro producto y escriba las dos como una tabla con Format, con una línea de guiones hecha con DupeString bajo la cabecera.