6.3.5 更多字符串RTL函数
借鉴其他编程语言中常用的操作名称来实现字符串辅助工具的决定所产生的一个影响是,这些操作的名称往往与传统的 Object Pascal 函数名称不同(这些函数今天仍可作为全局函数使用)。
下表列出了一些不匹配的函数名称:
全局 | 字符串类型辅助 |
---|---|
Pos | IndexOf |
IntToStr | Parse |
StrToInt | ToInteger |
CharsOf | Create |
StringReplace | Replace |
这只是字符串RTL中一些常用函数中名称不匹配的函数,而许多其他函数仍然使用与UpperCase或QuotedString相同的名称。System.SysUtils单元有更多函数,而System.StrUtils单元还有许多专注于字符串操作的函数,它们不是字符串辅助的一部分。
System.StrUtils单元中一些值得注意的函数包括:
- ResemblesText,实现Soundex算法(一种通过单词的发音而非实际拼写来识别单词的算法);
- DupeString,返回给定字符串请求的副本数;
- IfThen,如果条件为真,则返回第一个字符串,否则将返回第二个字符串(我在本章前面的代码片段中使用了该函数);
- ReverseString,返回具有相反字符序列的字符串。
6.3.6 格式化字符串
使用加号 (+) 运算符连接字符串,并使用某些转换函数,确实可以将各种数据类型的现有值构建成复杂的字符串,但要将数字、货币值和其他字符串格式化为最终字符串,还有另一种更强大的方法。复杂字符串格式化可以通过调用 Format 函数来实现,这是一种非常传统但仍极为常见的机制,不仅在 Object Pascal 中如此,在大多数编程语言中也是如此。
历史:打印格式字符串或 printf 函数系列可追溯到早期的编程语言,如 FORTRAN 66、PL/1 和 ALGOL 68。目前仍在使用的格式字符串结构(Object Pascal 使用的)与 C 语言的 printf 函数非常接近。有关历史概述,请参阅 en.wikipedia.org/wiki/Printf_format_string。
Format函数的参数是一个包含基本文本和一些占位符(用 % 符号标记)的字符串,以及一个数值数组,通常每个占位符对应一个数值数组。例如,如果要将两个数字格式化为一个字符串,可以这样写:
Format('First %d, Second %d', [N1, N2]);
其中 N1 和 N2 是两个整数值。第一个占位符由第一个值代替,第二个占位符由第二个值代替,依此类推。如果占位符的输出类型(用 % 符号后面的字母表示)与相应参数的类型不匹配,运行时就会出错。同样,没有传递足够的参数也会导致运行时错误。没有编译时类型检查是使用 Format 函数的最大缺点。
Format 函数使用开放式数组形参(如第 5 章所述,该参数可以有任意数量的值或任意数据类型)。除了使用 %d 之外,您还可以使用该函数定义的许多其他占位符,下表简要列出了这些占位符。这些占位符提供了给定数据类型的默认输出。不过,您也可以使用其他格式指定符来更改默认输出。例如,宽度指示符决定输出中的固定字符数;精度指示符则表示小数位数。例如:
Format('%8d', [N1]);
将数字 N1 转换为 8 个字符的字符串,文本右对齐(使用减号 (-) 指定左对齐),并填充空白。以下是各种数据类型的格式占位符列表:
- d(十进制):将相应的整数值转换为十进制数字的字符串。
- x(十六进制):将相应的整数值转换为十六进制数字的字符串。
- p(指针):将相应的指针值转换为用十六进制数字表示的字符串。
- s(字符串):将相应的字符串、字符或PChar(指向字符数组的指针)值复制到输出字符串。
- e(指数):将相应的浮点值基于科学计数法转换为字符串。
- f(浮点数):将相应的浮点值基于浮点数表示法转换为字符串。
- g(通用):使用浮点或指数符号将相应的浮点数值转换成尽可能短的十进制字符串。。
- n(数字):将相应的浮点值转换为使用千位分隔符的浮点字符串,通常由区域设置定义。
- m(货币):将相应的浮点值转换为表示货币金额的字符串。转换通常基于区域设置。
查看这些转换示例的最佳方法是自己尝试使用格式字符串。为了简化操作,我编写了 FormatString 示例,让用户为几个预定义的整数值提供格式化字符串。
程序的窗体在按钮上方有一个编辑框,最初放置一个简单的预定义格式化字符串作为占位符(‘%d - %d - %d’)。程序的第一个按钮可让您在编辑框中显示一个更复杂的格式字符串示例(代码对格式字符串 "Value %d,Align %4d,Fill %4.4d "的编辑文本进行了简单赋值)。通过第二个按钮,您可以使用以下代码将格式字符串应用到预定义值中,使用以下代码:
var
StrFmt: string;
N1, N2, N3: Integer;
begin
StrFmt := Edit1.Text;
N1 := 8;
N2 := 16;
N3 := 256;
Show(Format('Format string: %s', [StrFmt]));
Show(Format('Input data: [%d, %d, %d]', [N1, N2, N3]));
Show(Format('Output: %s', [Format(StrFmt, [N1, N2, N3])]));
Show(''); // 空行
end;
如果先用最初的格式字符串显示输出,然后再用示例格式字符串显示输出(也就是说,先按第二个按钮,再按第一个按钮,然后再按第二个按钮),就会得到类似下面的输出结果:
Format string: %d - %d - %d
Input data: [8, 16, 256]
Output: 8 - 16 - 256
Format string: Value %d, Align %4d, Fill %4.4d
Input data: [8, 16, 256]
Output: Value 8, Align 16, Fill 0256
然而,该程序的目的是让您编辑格式字符串并进行实验,以查看各种可用的格式选项的效果。