Bashk
Bashk

Reputation: 85

Delphi custom format string

I have a string that contains 8 to 12 characters (alphanumeric). I would like to use the Format function to format it such that after first 4 characters a hyphen to be inserted and after next 3 characters another hyphen to be inserted:

cccc-ccc-c

if string has 8 chrs

cccc-ccc-cc

if string has 9 chrs

cccc-ccc-ccc

if string has 10 chrs

cccc-ccc-cccc

if string has 11 chrs

cccc-ccc-ccccc

if string has 12 chrs

Is it possible to use a single lined Format function to acquire the effect? I admit that the usage of Format function is beyond my grasp.

Upvotes: 0

Views: 8122

Answers (3)

Uwe Raabe
Uwe Raabe

Reputation: 47704

The function you are looking for is FormatMaskText located in System.MaskUtils. The Mask to be used is 'cccc-ccc-ccccc;0;'.

Upvotes: 7

Ken White
Ken White

Reputation: 125689

There is no built-in format specifier (or combination of them) that will do the formatting you're looking to do.

You can, of course, write your own function to do so (name it, of course, with something meaningful to the values you're formatting):

function MyFormat(Value: string): String;
begin
  Assert(Length(Value) >= 8);
  Result := System.Insert(Value, '-', 5);
  Result := System.Insert(Result,'-', 9);
end;

Use it:

Value := MyFormat('12345678');      // Returns '1234-567-8'
Value := MyFormat('123456789');     // Returns '1234-567-89'
Value := MyFormat('1234567890');    // Returns '1234-567-890'

If you insist on trying to do it with Format, you need multiple calls to Copy (although you can skip the first one by using a width specifier). These can be done, of course, on a single line; I've spread it across multiple just for formatting here to eliminate horizontal scrolling.

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'

There is no way to use a "width specifer" type method to extract substrings within a string, though. (You can extract the first n characters using %.ns, but you can't do the first n characters starting at the fourth with any combination of specifiers.)

Upvotes: 1

Z .
Z .

Reputation: 12837

Use Insert instead of Format:

Insert(s, '-', 5);
Insert(s, '-', 9);

Upvotes: 1

Related Questions