填充数字格式的时间表达式,具有带前导零的可变分隔符
Posted
技术标签:
【中文标题】填充数字格式的时间表达式,具有带前导零的可变分隔符【英文标题】:Pad numbers formatted time expression having variable delimiters with leading zeros 【发布时间】:2020-09-19 19:24:14 【问题描述】:将字符串形成特定格式的最佳方法是什么,例如在 excel(##,# 等) 中?
我想将格式设置为 00:00.00,如果有人输入 1:10.10,我想在它们前面添加一个零。 如果输入看起来像 1.5.07,它必须转换为 01:50.07,更难的是:0.3 必须转换为 00:00.30。
我认为这可以通过一些正则表达式来实现,我可以编写预期的格式,但是我如何用这个来修改输入?
$input = "00:13,40";
echo preg_replace("/(d)2:(d)2\.(d)2/","???",$input);
输入中的 , 必须转换为点。输入可以是“任何东西”,例如 13.40,并且必须转换为 00:13.40。它必须替换错误的分隔符并在前面或结尾添加缺失的0 (0:13.4)
【问题讨论】:
您是否正在尝试将数字转换为小时:分钟:秒? 格式可以是任何东西,可以是时间,也可以是简单的数字,例如 0.0,1000 将是 1000.0 等等 我可以看到的问题是输入。让用户按照您期望的格式输入信息。我想这是为了时间? 试试这个:jsfiddle.net/u2smwbgL/1 是的。将显示例外格式,但我们都知道... ^^ 【参考方案1】:根据您的问题详细信息,我不知道我是否有足够的测试电池,但以下技术将纠正您提供的字符串的零填充。
该模式有效地解析具有 2 组可选数字的字符串,然后在字符串结尾之前需要一个数字。
该模式允许将冒号、逗号或点的任意组合作为分隔字符。如果您需要更多分隔字符,请将它们添加到字符类中。
我添加了一个负前瞻 ((?!\d+$)
) 以确保只有两组数字的数字不会使用第一组作为 小时(结果中的第一个数字)。
sprintf()
是在每组替换字符串中强制使用零填充格式的一种优雅方式。
代码:(Demo)
$tests = [
'1:10.10',
'1.5.07',
'0.3',
'00:13,40',
'15,17',
];
var_export(
preg_replace_callback(
'~(?:(\d1,2)[:.,](?!\d+$))?(?:(\d1,2)[:.,])?(\d1,2)$~',
function($m)
return sprintf('%02d:%02d.%02d', $m[1], $m[2], $m[3]);
,
$tests
)
);
输出:
array (
0 => '01:10.10',
1 => '01:05.07',
2 => '00:00.03',
3 => '00:13.40',
4 => '00:15.17',
)
【讨论】:
以上是关于填充数字格式的时间表达式,具有带前导零的可变分隔符的主要内容,如果未能解决你的问题,请参考以下文章