openlang

在 F# 中格式化字符串

我正在第一次编写 F# 库

使用 string.Format 时,提示说这个函数不存在。

是我哪里弄错了,还是本来就不能用?

从英语翻译查看原文

后续讨论 2

顺着彼此的依据读下去
  1. 固定链接

    如果不想写完整限定名,F# 允许使用 open。

    open System
    let greeting = String.Format("Hello {0}", "world")

    普通的编译应用和 F# interactive 都可以这样用(先输入 open 声明)。关键是 String 要用大写的 S。这是因为 C# 的 string 并不是普通类型名称,而是指向 System.String 的关键字。

    另一个值得考虑的选择是 sprintf。这是 F# 对 String.Format 的替代方案,有一些实用优点,比如会检查类型。

    let greeting = sprintf "Hello %s! Number is %d" "world" 56

    编译器会检查参数(string 和 int)是否符合格式说明符(%s 表示字符串,%d 表示整数)。需要部分应用函数时,这个函数也更自然。

    let values = [ 3 .. 12 ]
    let descriptions = values |> List.map (sprintf "number %d")

    结果是一个字符串列表,里面有 "number 3"、"number 4" 等内容……要用 String.Format 实现同样的效果,就得明确写出一个 lambda 函数。

    从英语翻译查看原文

同一个问题的其他角度

  1. 调用 String.Format 时怎样转义百分号?

    我的 strings.xml 文件保存了一个 SQL 查询,我想在代码中用 String.Format 构造最终字符串。SELECT 查询中有一个类似下面这样的 like 子句。 为了格式化,我用 %1$s 替换 'pattern',得到下面这样。…

    回复 3最近活动 java
  2. 仅当消息里有度数符号时才会 NAK(串口,Emacs)

    简单说,Temp: 23C 会收到 ACK,但 Temp: 23°C 会收到 NAK,板子上什么都不显示。日志行是 rx: "\25"。把波特率降到 4800、:flowcontrol 设成 hw、重新插拔,都没有任何变化。我看 tx: 那行是正常的…

    回复 1最近活动 emacs-lisp
  3. 像老 C++ 那样按字节截断,Rust 直接 panic

    在把一段老 C++ 移植到 Rust,它把 std::string 用一句普通的 s.substr(0, n) 截到字节上限,我本来以为一行就搞定了。在 C++ 里它大致能用,尽管 std::string 对 UTF-8 一无所知,会毫不犹豫地把一个…

    回复 4最近活动 rustcpp