Ao trabalhar com qualquer idioma, você provavelmente precisará formatar o texto, e o F # não é diferente.
Como o F # é uma linguagem .NET, sempre podemos usar Console.WriteLine (..) e String.Format (..), onde podemos usar qualquer um dos formatadores comuns que você usou no código .NET normal.
No entanto, o F # também oferece suporte a um método C mais parecido com uma sintaxe, disponível no módulo Core.Printf. Uma função dentro dela pode ser usada em vez de usar a classe .NET Console.WriteLine (..).
A função F # equivalente que deve ser usada para gravar na saída padrão é printfn, que é realmente o método preferido ao trabalhar com formatação de texto em F #.
Por que o printfn é preferível ao Console.WriteLine (..)?
Existem várias razões pelas quais printfn é preferido; algumas das principais razões são apresentadas abaixo:
- Verificação de tipo estático. Isso significa que, se passarmos o valor int onde a string é esperada, seremos avisados sobre isso
- Como printfn é uma função F # nativa, ela atua como qualquer outra função F #.
Considere os seguintes trechos 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"
Se observarmos agora uma captura de tela desse código no IDE do Visual Studio, realmente veremos que as linhas que esperávamos falhar são claramente mostradas como errôneas:

Como usar o printfn?
Talvez seja melhor começar examinando alguns dos formatadores padrão disponíveis para trabalhar com valores. A tabela a seguir do MSDN mostra os operadores padrão disponíveis para você:
msdn.microsoft.com/en-us/library/ee370560.aspxEntão, que tal criar uma ótima formatação além do padrão?
Então, agora vimos como gravar a saída formatada na saída padrão (printfn fez isso), mas e se quisermos usar a linha formatada em outros lugares? E se quisermos associar um valor de string a uma string lindamente formatada que construímos usando algumas das ferramentas de formatação acima, ou mesmo desejássemos gravar em StringBuilder ou TextWriter, o F # facilita isso?
Bem, sim, na verdade é, você encontrará muitos outros recursos úteis no módulo Core.Printf. A lista completa no momento da redação deste artigo era a seguinte:
Listabprintf Imprima em StringBuilder.
eprintf Imprime a saída formatada em stderr.
eprintfn Imprime a saída formatada no stderr adicionando uma nova linha.
failwithf Imprime em um buffer de cadeias e lança uma exceção com o resultado fornecido. Impressoras secundárias devem retornar seqüências de caracteres.
fprintf Imprime em gravador de texto.
fprintfn Imprime no gravador de texto adicionando uma nova linha.
kbprintf Semelhante ao bprintf, mas chama a função especificada para gerar o resultado. Veja kprintf.
kfprintf Semelhante ao fprintf, mas chama a função especificada para gerar o resultado. Veja kprintf.
kprintf Como printf, mas chama a função especificada para gerar o resultado. Por exemplo, eles permitem que a impressão seja redefinida à força após toda a saída ter sido inserida no canal, mas não antes.
kspintf Como o sprintf, mas chama a função especificada para gerar o resultado. Veja kprintf.
printf Imprime a saída formatada na saída padrão.
printfn Imprime a saída formatada na saída padrão adicionando uma nova linha.
sprintf Imprime em uma string usando o buffer interno da string e retorna o resultado como uma string. Impressoras secundárias devem retornar seqüências de caracteres.
Não vou passar por tudo isso, mas considerarei o mais comum:
bprintf
Imprime no 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())
Isso fornecerá essa saída em um aplicativo de console F #
fprintf
Imprime em um 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()
Isso fará com que o arquivo seja criado em temp

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