F# 使用printf保留特殊字符的格式

F# 使用printf保留特殊字符的格式,f#,printf,F#,Printf,我从.net样式({0}…)切换到printf样式格式,并注意到特殊字符的格式不再保留。 使用printf保存格式的技术是什么? 我正在做类似于Printf.kprintf Log.Debug format的事情 我知道StringFormat可以生成文字字符串(prenends a@“”),但printf不能 编辑: 我基本上想保留格式,比如反斜杠。如果打印文件路径,我希望看到“C:\Program Files…”不受干扰,就像StringFormat打印一样。如果使用%s格式,则printf

我从.net样式({0}…)切换到printf样式格式,并注意到特殊字符的格式不再保留。 使用printf保存格式的技术是什么? 我正在做类似于
Printf.kprintf Log.Debug format
的事情

我知道StringFormat可以生成文字字符串(prenends a@“”),但printf不能

编辑:
我基本上想保留格式,比如反斜杠。如果打印文件路径,我希望看到“C:\Program Files…”不受干扰,就像StringFormat打印一样。

如果使用
%s
格式,则
printfn
函数系列打印字符串时不进行任何转义
%s
格式指定参数为字符串,应按原样打印):

如果使用
%A
(它指定参数是任何对象,并且应该使用F#语法打印-请注意,这适用于列表)。尽管这似乎也不会转义
字符:

> printfn "%A" "C:\\Test";;
"C:\Test"
val it : unit = ()

如果使用
%s
格式,则
printfn
函数系列将打印字符串而不进行任何转义
%s
格式指定参数为字符串,应按原样打印):

如果使用
%A
(它指定参数是任何对象,并且应使用F#语法打印-注意,这适用于列表)。尽管这似乎也不会转义
字符:

> printfn "%A" "C:\\Test";;
"C:\Test"
val it : unit = ()

F#中有两种类型的字符串文字:看起来像
“string”
的普通字符串文字和看起来像
@“string”
的逐字字符串文字。无论哪种方式,字符串都会成为内存中.NET
System.String
类型的实例,它本质上只是一系列
char
值。如果要创建包含某些字符(如反斜杠)的字符串,则在使用普通字符串文字时应将其转义:
“C:\\Program Files\\…”
,但在使用逐字字符串文字时不需要执行此操作:
@“C:\Program Files\…”
。无论哪种方式,内存中的值都将由字符“C”、““:”、“\”、“P”、“r”等组成。您可能会发现,忘记转义反斜杠并不总是会导致问题,因为反斜杠只有在特定字符之前才会被解释为转义序列(因此您可以避开
“C:\Program Files”
但不是
“C:\test”

值进入内存后,
String.Format
printf
函数系列的工作方式基本相同:

let sf1 = System.String.Format("{0}", "C:\\test")
let sf2 = System.String.Format("{0}", @"C:\test")
let pf1 = sprintf "%s" "C:\\test"
let pf2 = sprintf "%s" @"C:\test"
您会发现所有这些值都是相同的(并且在正确的位置包含反斜杠)。同样地:

let sf_bad = System.String.Format("{0}", "C:\test")
let pf_bad = sprintf "%s" "C:\test"
这两个也是一样的,而且都被弄坏了


请注意,
System.String.Format
不会撤消创建字符串文字时发生的损坏-它无法知道用户实际上不希望在字符串中嵌入制表符。

在F#中有两种类型的字符串文字:看起来像
“String”的普通字符串文字
和逐字字符串文字,看起来像
@“string”
。无论哪种方式,字符串都会成为内存中.NET
System.String
类型的实例,它本质上只是一系列
char
值。如果要创建包含某些字符(如反斜杠)的字符串,则在使用普通字符串文字时应将其转义:
“C:\\Program Files\\…”
,但在使用逐字字符串文字时不需要执行此操作:
@“C:\Program Files\…”
。无论哪种方式,内存中的值都将由字符“C”、““:”、“\”、“P”、“r”等组成。您可能会发现,忘记转义反斜杠并不总是会导致问题,因为反斜杠只有在特定字符之前才会被解释为转义序列(因此您可以避开
“C:\Program Files”
但不是
“C:\test”

值进入内存后,
String.Format
printf
函数系列的工作方式基本相同:

let sf1 = System.String.Format("{0}", "C:\\test")
let sf2 = System.String.Format("{0}", @"C:\test")
let pf1 = sprintf "%s" "C:\\test"
let pf2 = sprintf "%s" @"C:\test"
您会发现所有这些值都是相同的(并且在正确的位置包含反斜杠)。同样地:

let sf_bad = System.String.Format("{0}", "C:\test")
let pf_bad = sprintf "%s" "C:\test"
这两个也是一样的,而且都被弄坏了


请注意,
System.String.Format
不会撤消创建字符串文字时发生的损坏-它无法知道用户实际上不希望在字符串中嵌入制表符。

您希望保留哪些特殊字符?您可以添加一些示例吗?您希望保留哪些特殊字符?你能举个例子吗?这不是我想要的。您已经跳过了示例中的反斜杠,因此在输出中只看到一个反斜杠。我有一个只有一个反斜杠的输入,我想在输出中看到一个反斜杠。这与
printf
无关,与字符串文字在特定编程语言中的工作方式有关。那么
printfn“%a”@“C:\Test”
呢?这不是我想要的。您已经跳过了示例中的反斜杠,因此在输出中只看到一个反斜杠。我的输入有一个反斜杠,我想在输出中看到一个反斜杠。这与
printf
无关,与字符串文字在特定编程语言中的工作方式有关。那么
printfn“%a”@“C:\Test”
呢?是的,谢谢,逐字逐句是我要找的词。有没有一种方法可以通过参数枚举,使字符串一字不差?@Alex-我不明白这个问题:“一字不差”只适用于您在源代码中编写的文本