我有一个包含8到12个字符(字母数字)的字符串。我想使用Format
函数对其进行格式化,使得在前4个字符后插入连字符,在接下来的3个字符后插入另一个连字符:
CCCC-CCCC
如果字符串有8个小时
CCCC-CCC-CC
如果字符串有9个小时
CCCC-CCC-CCC
如果字符串有10个小时
CCCC-CCC-CCCC
如果字符串有11个小时
CCCC-CCC-CCCCC
如果字符串有12个小时
是否可以使用单个内联Format
函数来获得效果?我承认Format
功能的使用是我无法掌握的。
答案 0 :(得分:6)
您正在寻找的函数是位于System.MaskUtils中的FormatMaskText
。要使用的掩码为'cccc-ccc-ccccc;0;'
。
答案 1 :(得分:1)
使用Insert而不是Format:
Insert(s, '-', 5);
Insert(s, '-', 9);
答案 2 :(得分:1)
没有内置的格式说明符(或它们的组合)可以执行您希望进行的格式化。
当然,您可以编写自己的函数(当然,将其命名为对您要格式化的值有意义的内容):
function MyFormat(Value: string): String;
begin
Assert(Length(Value) >= 8);
Result := System.Insert(Value, '-', 5);
Result := System.Insert(Result,'-', 9);
end;
使用它:
Value := MyFormat('12345678'); // Returns '1234-567-8'
Value := MyFormat('123456789'); // Returns '1234-567-89'
Value := MyFormat('1234567890'); // Returns '1234-567-890'
如果您坚持尝试使用Format
,则需要多次调用Copy
(尽管您可以使用宽度说明符跳过第一个)。当然,这些可以在一条线上完成;我把它传播到多个只是为了格式化,以消除水平滚动。
Str := '12345678';
Value := Format('%.4s-%s-%s',
[Str,
Copy(Str, 5, 3),
Copy(Str, 8, MaxInt)]); // Return '1234-567-8'
Str := '1234567890';
Value := Format('%.4s-%s-%s',
[Str,
Copy(Str, 5, 3),
Copy(Str, 8, MaxInt)]); // Return '1234-567-890'
但是,无法使用“width specifer”类型方法来提取字符串中的子字符串。 (您可以使用n
提取第一个%.ns
字符,但不能使用任何说明符组合从第四个开始执行第一个n
个字符。)