【问题标题】:Function modifying StringFormat修改StringFormat的函数
【发布时间】:2015-08-05 17:49:39
【问题描述】:

我想创建一个函数,它将StringFormat 作为参数,在其前面添加一个任意字符串,并返回一个函数,该函数采用正确数量和类型的参数,并返回一个使用sprintf 创建的字符串和改变格式。

目标是创建一个产生这样结果的函数(前面的字符串是#):

xprintf "%d-%.2f" 5 5. // -> "#5-5.00"
xprintf "%A" [42] // -> "#[42]"

我天真地尝试过以下操作:

let xprintf (format: Printf.StringFormat<'a>) = Printf.StringFormat<'a>(string format |> (+) "#") |> sprintf

确实可以编译,但是当我在运行时使用它时,我得到了一个InvalidCastException。我开始认为这种方法不可能奏效。可以自定义PrintFormat 吗?关于如何在不平凡的层面上使用各种格式化程序的文章/指南似乎非常稀缺。

【问题讨论】:

  • 在正文中尝试format.Value 而不是仅仅format
  • @kvb 是的,似乎有效。

标签: f# string-formatting


【解决方案1】:

您可以使用Printf.kprintf 执行此操作。它通过延续返回格式化的字符串,这让你可以对格式化的字符串做任何你需要的事情:

let xprintf fmt =
  Printf.kprintf (fun s -> "#" + s) fmt

编辑:我认为有一种方法可以直接使用格式字符串,但我从未这样做过。如果您想添加一个额外的参数,您仍然可以使用kprintf 来完成,只需在后续中再进行一次格式化:

let xprintf fmt num =
  Printf.kprintf (sprintf "# %d %s" num) fmt

【讨论】:

  • 如果我想在格式前面加上%d 怎么办(因为你的解决方案没有改变它),因此需要额外的参数? xprintf " - number" 5 // -&gt; "5 - number"。这可行吗?
猜你喜欢
  • 2018-02-12
  • 2016-03-07
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
相关资源
最近更新 更多