DMarlon Studio

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.

Pascal · Textos con StrUtils y Format en DMarlon Studio: el código del ejemplo y su salida en la terminal

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

  • ExtractWord y WordCount trocean por los separadores que usted elija.
  • En Format, %-16s alinea a la izquierda y %8.2f a la derecha.
  • %.6d rellena con ceros y %x escribe en hexadecimal.
  • Las funciones ...Text no distinguen mayúsculas; las ...Str, sí.
  • IfThen elige 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.