Каков наилучший способ сформировать строку в определенном формате, например, в 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 )
Решение проблемы
Я не знаю, достаточно ли у меня тестовой батареи из деталей вашего вопроса, но следующий метод исправит добавление нуля в строки, которые вы предоставили.
Шаблон эффективно анализирует строку с двумя необязательными наборами чисел, а затем требуемым числом перед концом строки.
Шаблон допускает любую комбинацию двоеточий, запятой или точек в качестве символов-разделителей. Если вам нужны дополнительные символы-разделители, добавьте их в классы символов.
Я добавил отрицательное опережение ( (?!\d+$)), чтобы число, состоящее только из двух наборов чисел, не использовало первый набор в качестве часов (первое число в результате).
sprintf()— это элегантный способ принудительного применения формата, дополненного нулями, в каждой группе замещающей строки.
Код: ( Демо )
$tests = [
'1:10.10',
'1.5.07',
'0.3',
'00:13,40',
'15,17',
];
var_export(
preg_replace_callback(
'~(?:(\d{1,2})[:.,](?!\d+$))?(?:(\d{1,2})[:.,])?(\d{1,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',
)
В качестве альтернативы вы можете добиться того же результата, ослабив шаблон, чтобы сопоставлять цифры и нецифры (в чередующемся порядке) и отдать приоритет значениям, которые находятся дальше справа от строки.
Код: ( Демо )
preg_replace_callback(
'~(?:(\d+)\D+)??(?:(\d+)\D+)?(\d+)$~',
function($m) {
unset($m[0]);
return vsprintf('%02d:%02d.%02d', $m);
},
$tests
)
Комментариев нет:
Отправить комментарий