Это было хорошее https://stackoverflow.com/a/11810957/185565 решение для бедняков. Один комментарий рассматривал счетчик для спасения в случае чрезвычайной ситуации. Это моя модификация.
function doTheMagic(counter) {
alert("It worked on " + counter);
}
// wait for document ready then call handler function
var checkLoad = function(counter) {
counter++;
if (document.readyState != "complete" && counter<1000) {
var fn = function() { checkLoad(counter); };
setTimeout(fn,10);
} else doTheMagic(counter);
};
checkLoad(0);
<?php
$i = '123456789';
echo 'result: ', wordwrap($i, 3, '-', true);
печатает result: 123-456-789
Я не большой поклонник регулярных выражений для простого извлечения строк (особенно извлечения фиксированной длины), предпочитая их для более сложных вещей. Практически в каждом языке есть функция подстроки, поэтому, предполагая, что ваш ввод уже был проверен, простой (псевдокод, поскольку вы не указали язык):
s = substring (s,0,3) + "-" + substring (s,3,3) + "-" + substring (s,6,3)
Если вы хотите, чтобы каждые три символа для строки переменной длины (с нечетный размер в конце):
t = ""
sep = ""
while s != "":
if s.len <= 3:
t = t + sep + s
s = ""
else:
t = t + sep + substring (s,0,3)
s = substring (s,3)
sep = "-"
s = t
Для любого языка:
В интересах полноты, вот решение Python:
>>> a = "123456789"
>>> a[0:3] + "-" + a[3:6] + "-" + a[6:9]
'123-456-789'
Поскольку вы обновили свой вопрос, указав решение PHP, это должно работать:
substr($a, 0, 3) . "-" . substr($a, 3, 3) . "-" . substr($a, 6, 3)
См. substr
для получения дополнительной информации об этой функции. Это будет работать не только для цифр, но и для буквенных символов.
Еще одна версия Python:
>>> x="123456789"
>>> out=[x[i:i+3] for i in xrange(0, len(x), 3)]
>>> print "-".join(out)
123-456-789
Я думаю, что это можно разумно сделать в регулярном выражении с опережением:
s/(.{3})(?=.)/$1-/g
Поскольку вы упомянули PHP в комментарии:
preg_replace ("/(.{3})(?=.)/", "$1-", $string);
edit : После того, как VolkerK показал wordwrap
, я обнаружил chunk-split
в документации:
$new_string = chunk_split ($string, 3, '-');
Это имеет то преимущество, что оно также работает, когда в строке есть пробелы (перенос слов предпочел бы разбивать на пробелы).
В Perl:
#!/usr/bin/perl
use strict;
use warnings;
my $string = "123456789";
$string =~ /(\d{3})(\d{3})(\d+)/;
print "$1-$2-$3"
Вы можете сделать это (среди прочего) с помощью совпадения и замены регулярного выражения. Точный синтаксис зависит от инструмента или языка программирования, который вы используете. Например, один из способов сделать это в Perl - это
$a = "123456789";
$a =~ s/(\d{3})/$1-/g;
chop($a);
print $a;
Строка 2 заменяет каждые 3 цифры на те же 3 цифры и тире. С помощью chop () мы удаляем завершающее тире.
Здесь возникает еще один вопрос. Что делать, если нет струны? t содержать количество цифр, кратное 3? Если бы такие строки были разрешены, то приведенный выше фрагмент потребовал бы модификации.
Кроме того, в зависимости от специфики случая, вы можете обойтись простой заменой подстроки или разрезанием строки.
Еще один пример Perl. Это не удаляет конечные группы меньше трех и оставляет только начальные группы менее трех цифр. Он основан (довольно беззастенчиво) на примере «денежных чисел» из Learning Perl (стр. 212 5-го изд.):
#!/usr/bin/env perl
use strict;
use warnings;
print "Gimme' a number: ";
chomp(my $number = <STDIN>);
1 while ($number =~ s/([0-9]{3})([0-9]+)/$1-$2/);
print "Now it's $number\n";