Delphi自定义格式字符串

时间:2014-04-11 20:00:52

标签: delphi

我有一个包含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功能的使用是我无法掌握的。

3 个答案:

答案 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个字符。)