填充数字格式的时间表达式,具有带前导零的可变分隔符

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',
)

【讨论】:

以上是关于填充数字格式的时间表达式,具有带前导零的可变分隔符的主要内容,如果未能解决你的问题,请参考以下文章

格式化包含带前导零的小数点的数字

dateFormat时间格式

日期格式:

iOS 手记

iOS开发中的NSDateFormatter日期格式解析总结

带前导零的 Barcode4j UPCA 扫描码