Stephen Swensen
Stephen Swensen

Reputation: 22297

Newlines and formatters

I recently got bit by becoming complacent writing things like

printf "\n%f\n" 3.2

instead of

printf "%s%f%s" Environment.NewLine 3.2 Environment.NewLine

My question is: is there any way to write the safe second version as nicely as the first (i.e. a special character in the format string which inserts Environment.Newline so that an argument for each newline instance in the format string isn't required)?

Upvotes: 8

Views: 6875

Answers (2)

Daniel
Daniel

Reputation: 47904

There's not an escape sequence, but you could shorten it:

[<AutoOpen>]
module StringFormatting =
    let nl = System.Environment.NewLine

//Usage
printfn "%s%f%s" nl 3.2 nl

Here is the list of character escapes on MSDN.

As an aside, I wonder what this would do:

printfn @"
%f
" 3.2

Upvotes: 8

Mauricio Scheffer
Mauricio Scheffer

Reputation: 99720

How about using kprintf for a double pass, replacing \n with NewLine:

let nprintf fmt = Printf.kprintf (fun s -> s.Replace("\n", Environment.NewLine) |> printf "%s") fmt

Then in nprintf "\n%f\n" 3.2 all \n get replaced by NewLine.

Upvotes: 10

Related Questions