F # 3: Formato de texto

Cuando trabaje con cualquier idioma, lo más probable es que necesite formatear el texto, y F # no es diferente.

Dado que F # es un lenguaje .NET, siempre podemos usar Console.WriteLine (..) y String.Format (..), donde podemos usar cualquiera de los formateadores habituales que usó en su código .NET habitual.

Sin embargo, F # también admite un método C más similar a la sintaxis, que está disponible en el módulo Core.Printf. Se puede usar una función dentro de ella en lugar de usar la clase Console.WriteLine (..) .NET.

La función equivalente de F # que se debe usar para escribir en la salida estándar es printfn, que en realidad es el método preferido cuando se trabaja con formato de texto en F #.

¿Por qué es preferible printfn a Console.WriteLine (..)?


Hay varias razones por las que se prefiere printfn; algunas de las razones principales se dan a continuación:

  • Comprobación de tipo estático. Esto significa que si pasamos el valor int donde se espera la cadena, se nos advertirá sobre esto
  • Dado que printfn es una función nativa de F #, actúa como cualquier otra función de F #.

Considere los siguientes fragmentos de código

//   printfn "should be a decimal value %d" "cat" // printfn "should be a decimal value %d" 42 //  ,   Console.WriteLine("should be a decimal value {0}" , "cat") //     printfn "this only expected 1 arg of type decimal %d" 42 "dog" //    ,   Console.WriteLine("this only expected 1 arg of type decimal {0}" , 42, "dog") // ,   printfn "this only expected 2 args of type decimal %d and string %s" 42 "dog" 

Si ahora miramos una captura de pantalla de este código en el IDE de Visual Studio, realmente vemos que las líneas que esperábamos fallar se muestran claramente como erróneas:

imagen

¿Cómo usar printfn?


Quizás sea mejor comenzar observando algunos de los formateadores estándar disponibles para trabajar con valores. La siguiente tabla de MSDN muestra los operadores estándar disponibles para usted: msdn.microsoft.com/en-us/library/ee370560.aspx

Entonces, ¿qué pasa con la creación de un gran formato además del estándar?


Entonces, ahora vimos cómo escribir una salida formateada en una salida estándar (printfn hizo esto), pero ¿qué pasa si queremos usar la línea formateada en otros lugares? ¿Qué sucede si queremos asociar un valor de cadena con una cadena bellamente formateada que construimos usando algunas de las herramientas de formato anteriores, o incluso si quisiéramos escribir en StringBuilder o TextWriter, F # facilita esto?

Bueno, sí, en realidad lo es, encontrará muchas otras funciones útiles en el módulo Core.Printf. La lista completa al momento de escribir esto era la siguiente:

Lista
bprintf Imprimir en StringBuilder.
eprintf Imprime la salida formateada en stderr.
eprintfn Imprime la salida formateada en stderr agregando una nueva línea.
failwithf Imprime en un búfer de cadena y lanza una excepción con el resultado dado. Las impresoras secundarias deben devolver cadenas.
fprintf Imprime al escritor de texto.
fprintfn Imprime al escritor de texto agregando una nueva línea.
kbprintf Similar a bprintf, pero llama a la función especificada para generar el resultado. Ver kprintf.
kfprintf Similar a fprintf, pero llama a la función especificada para generar el resultado. Ver kprintf.
kprintf Igual que printf, pero llama a la función especificada para generar el resultado. Por ejemplo, permiten que la impresión se reinicie por la fuerza después de que toda la salida se haya ingresado en el canal, pero no antes.
kspintf Al igual que sprintf, pero llama a la función especificada para generar el resultado. Ver kprintf.
printf Imprime la salida formateada a la salida estándar.
printfn Imprime la salida formateada a la salida estándar agregando una nueva línea.
sprintf Imprime en una cadena utilizando el búfer de cadena interno y devuelve el resultado como una cadena. Las impresoras secundarias deben devolver cadenas.

No voy a pasar por todo esto, pero consideraré lo más común:

bprintf


Imprime en StringBuilder.

 let builder = new StringBuilder(524288) Printf.bprintf builder "This will be a string line : %s\r\n" "cat" Printf.bprintf builder "This will be a bool line : %b\r\n" true Printf.bprintf builder "This will be a int line : %u\r\n" 42 Printf.bprintf builder "This will be a hex line : %X\r\n" 255 printfn "%s" (builder.ToString()) 

Esto dará este resultado en una aplicación de consola F #

fprintf


Impresiones en un escritor de texto.

 use sw = new StreamWriter(@"c:\temp\fprintfFile.txt") fprintf sw "This is a string line %s\r\n" "cat" fprintf sw "This is a int line %i" 10 sw.Close() 

Esto hará que el archivo se cree en temp

imagen

sprintf


 let result = Printf.sprintf "This will return a formatted string : %s\r\n" "cat" printfn "%s" result 

imagen

Source: https://habr.com/ru/post/470037/


All Articles