Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi自定义格式字符串_Delphi - Fatal编程技术网

Delphi自定义格式字符串

Delphi自定义格式字符串,delphi,Delphi,我有一个包含8到12个字符(字母数字)的字符串。我想使用Format函数对其进行格式化,以便在前4个字符后插入一个连字符,在接下来的3个字符后插入另一个连字符: cccc-ccc-c 如果字符串有8个chr 中交 如果字符串有9个chr 中交 如果字符串有10个chr 中交 如果字符串有11个chr cccc-ccc-ccccc 如果字符串有12个chr 是否可以使用单行的格式功能来获得效果?我承认Format函数的用法我无法理解。使用Insert代替Format: Insert(s, '-',

我有一个包含8到12个字符(字母数字)的字符串。我想使用
Format
函数对其进行格式化,以便在前4个字符后插入一个连字符,在接下来的3个字符后插入另一个连字符:

cccc-ccc-c

如果字符串有8个chr

中交

如果字符串有9个chr

中交

如果字符串有10个chr

中交

如果字符串有11个chr

cccc-ccc-ccccc

如果字符串有12个chr


是否可以使用单行的
格式
功能来获得效果?我承认
Format
函数的用法我无法理解。

使用Insert代替Format:

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

没有内置的格式说明符(或它们的组合)来执行您希望执行的格式设置

当然,您可以编写自己的函数来实现这一点(当然,可以用一些对正在格式化的值有意义的东西来命名它):

使用它:

Value := MyFormat('12345678');      // Returns '1234-567-8'
Value := MyFormat('123456789');     // Returns '1234-567-89'
Value := MyFormat('1234567890');    // Returns '1234-567-890'
如果坚持使用
格式
,则需要多次调用
复制
(尽管可以使用宽度说明符跳过第一个调用)。当然,这些可以在一条线上完成;我把它分散在多个区域,只是为了在这里格式化,以消除水平滚动

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'

但是,无法使用“宽度说明符”类型的方法来提取字符串中的子字符串。(您可以使用
%.ns
提取第一个
n
字符,但不能使用任何说明符组合从第四个开始提取第一个
n
字符。)

您要查找的函数是位于System.MaskUtils中的
FormatMaskText
。使用的遮罩为
“cccc-ccc-ccccc;0;'格式(“%s-%s-%s”,[Copy(s,1,4),Copy(s,5,3),Copy(s,8,MaxInt)]TLama:请将此作为答案发布。您为什么决定解决方案是什么?如果你知道答案,为什么要问这个问题?为什么强制使用格式?:)我认为“我想使用格式功能”加上“是否可以使用格式?”排除了格式使用的单一(强制性)解决方案。我很好奇是否有可能通过使用Format函数来达到预期的效果,因为我已经知道了其他方法。但是这里给出的解决方案是正确的,我感谢大家。很好,很简单,但是违反了查询的规则specification@Argalatyr:怎么会这样?(除了不是一个单一格式的语句,这实际上更困难,因为需要重复的复制调用。)“单行”和“格式函数”-虽然它们有些武断,但它们是明确的。我认为TLama的评论很好地说明了查询者想要的是什么。关于哪个选项更快,可能很有趣。插入或格式化和复制。@GrayMatter:除非经常调用它,否则它可能并不重要。如果我用分析器将其识别为瓶颈,我只会担心,即使在那时,我也不确定这些差异是否有意义。我提到它的原因是OP专门要求一个格式命令。有时候最好看看其他的选择。TRegEx.Replace也可能是一种替代方法。@Graymatter:Regex很可能整体速度较慢,而且肯定会占用更多内存。它们非常适合搜索或更复杂的替换,但我敢打赌,在任何一天,插入或多个拷贝都会加快这类事情的速度。没有内置的格式说明符(或它们的组合)可以满足海报的要求,这就是为什么我发布了两种可能的解决方案。最接近的方法是使用我提供的格式字符串中的第一个,它使用宽度说明符删除一个复制调用,但无法执行字符串的其他块。谢谢Ken。你的答案还行,但Uwe的正是我需要的。
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'