Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用sprintf构建格式字符串,以F#为单位?_F#_String Formatting - Fatal编程技术网

如何使用sprintf构建格式字符串,以F#为单位?

如何使用sprintf构建格式字符串,以F#为单位?,f#,string-formatting,F#,String Formatting,我试着从: sprintf "%3.1f" myNumber 致: 这是不可能的 我遇到的情况是数字精度取决于某些设置,所以我希望能够创建自己的格式化程序字符串 我知道可以用String.Format来完成,但我很好奇sprintf或ksprinf是否有F#方式;能做到吗?简单回答 编辑:在F#Slack上的迭戈·埃斯梅里奥向我展示了一种更简单的方法,我在得出下面的答案时,真的从来没有想到过。技巧是直接使用printformat,如下所示 //信用:迭戈。这 设format

我试着从:

sprintf "%3.1f" myNumber
致:

这是不可能的

我遇到的情况是数字精度取决于某些设置,所以我希望能够创建自己的格式化程序字符串

我知道可以用String.Format来完成,但我很好奇sprintf或ksprinf是否有F#方式;能做到吗?

简单回答 编辑:在F#Slack上的迭戈·埃斯梅里奥向我展示了一种更简单的方法,我在得出下面的答案时,真的从来没有想到过。技巧是直接使用
printformat
,如下所示

//信用:迭戈。这
设formatPrec精度=
打印格式字符串,单位,字符串,字符串>(sprintf“%%1.%if”精度)
设x=15.234
设a=sprintf(formatPrec 0)x
设b=sprintf(formatPrec 1)x
设c=sprintf(formatPrec 3)x
输出:

val formatPrec : precision:int -> PrintfFormat<(float -> string),unit,string,string>
val x : float = 15.234
val a : string = "15"
val b : string = "15.2"
val c : string = "15.234"
这看起来可能很混乱,但既然我们只需要改变一点点,我们就可以简单地做到:

打开Microsoft.FSharp.Quotences//F的一部分#
打开Microsoft.FSharp.Quotences.Patterns//F的一部分#
打开FSharp.quotes.Evaluator//NuGet包(同名)
//这是一个函数,它将动态地创建一个函数
let withFormat格式=
让我们来解释一下=
匹配
|Let(变量,expr1,expr2)->
将expr1与
|调用(None,methodInfo,[强制(NewObject(ctor,[值]),mprintFormat)]->
Expr.Let(var,Expr.Call(methodInfo,[Expr.convere(Expr.NewObject(ctor,[Expr.Value format]),mprintFormat)]),expr2)
|不会发生带有“oops”//的故障
|不会发生带有“oops”//的故障
expr.CompileUntyped():?>(浮点->字符串)
要使用此功能,我们现在只需执行以下操作:

>格式为“%1.2f”123.456789911233445566;;
val it:string=“123.46”
>格式为“%1.5f”123.45678911223344556;;
val it:string=“123.45679”
>格式为“%1.12f”123.45678911223344556;;
val it:string=“123.45678991123”
或者像这样:

>let format=“%0.4ef”;;
val格式:string=“%0.4ef”
>格式为123.456789911233445566;;
val it:string=“1.2346e+002f”
在编译时,格式字符串现在是否为固定字符串并不重要。但是,如果在性能敏感区域使用此选项,则可能需要缓存生成的函数,因为重新编译表达式树的开销适中。

Simple answer 编辑:在F#Slack上的迭戈·埃斯梅里奥向我展示了一种更简单的方法,我在得出下面的答案时,真的从来没有想到过。技巧是直接使用
printformat
,如下所示

//信用:迭戈。这
设formatPrec精度=
打印格式字符串,单位,字符串,字符串>(sprintf“%%1.%if”精度)
设x=15.234
设a=sprintf(formatPrec 0)x
设b=sprintf(formatPrec 1)x
设c=sprintf(formatPrec 3)x
输出:

val formatPrec : precision:int -> PrintfFormat<(float -> string),unit,string,string>
val x : float = 15.234
val a : string = "15"
val b : string = "15.2"
val c : string = "15.234"
这看起来可能很混乱,但既然我们只需要改变一点点,我们就可以简单地做到:

打开Microsoft.FSharp.Quotences//F的一部分#
打开Microsoft.FSharp.Quotences.Patterns//F的一部分#
打开FSharp.quotes.Evaluator//NuGet包(同名)
//这是一个函数,它将动态地创建一个函数
let withFormat格式=
让我们来解释一下=
匹配
|Let(变量,expr1,expr2)->
将expr1与
|调用(None,methodInfo,[强制(NewObject(ctor,[值]),mprintFormat)]->
Expr.Let(var,Expr.Call(methodInfo,[Expr.convere(Expr.NewObject(ctor,[Expr.Value format]),mprintFormat)]),expr2)
|不会发生带有“oops”//的故障
|不会发生带有“oops”//的故障
expr.CompileUntyped():?>(浮点->字符串)
要使用此功能,我们现在只需执行以下操作:

>格式为“%1.2f”123.456789911233445566;;
val it:string=“123.46”
>格式为“%1.5f”123.45678911223344556;;
val it:string=“123.45679”
>格式为“%1.12f”123.45678911223344556;;
val it:string=“123.45678991123”
或者像这样:

>let format=“%0.4ef”;;
val格式:string=“%0.4ef”
>格式为123.456789911233445566;;
val it:string=“1.2346e+002f”

在编译时,格式字符串现在是否为固定字符串并不重要。但是,如果在性能敏感区域使用此选项,则可能需要缓存生成的函数,因为重新编译表达式树的成本相当高。

我甚至不知道引用是件好事!我会阅读他们的文章来理解你的答案!谢谢你的展示!同时,我将使用您编辑的简化解决方案。我甚至不知道引用语是一种东西!我会阅读他们的文章来理解你的答案!谢谢你的展示!同时,我将使用您编辑的简化解决方案。