Delphi自定义格式字符串
我有一个包含8到12个字符(字母数字)的字符串。我想使用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, '-',
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'