Класс или функция для форматирования чисел с использованием хеш-символов - PullRequest
1 голос
/ 27 марта 2012

Какой самый простой способ отформатировать строку на основе другой входной строки, использующей хеш-символы, минус и пробелы.

У меня есть одна строка, содержащая номер телефона, который может выглядеть следующим образом (илиимеет несколько пробелов):

012-34567890

У меня есть другая строка, которая содержит формат, в который должно быть преобразовано число, это выглядит так:

### - ## ## ##

или

## - ### ## ##

или

###-## ## ##

Хеш-позиции должны быть ведущими для форматирования чисел.Кажется, я не могу думать о том, что делает это ...

В некоторых случаях (например, для международных телефонных номеров) должны использоваться символы (,) и +.В этом случае строка преобразования выглядит следующим образом (например)

+(##)-(#)##-## ## ##

У кого-нибудь есть идеи?

1 Ответ

3 голосов
/ 27 марта 2012
$number = "012-34567890";
$format1 = "### - ## ## ##";
$format2 = "+(##)-(#)##-## ## ##";
$format3 = "## - ### ## ####";
$format4 = "###-## ## ####";

function formatNumber($number, $format)
{
    // get all digits in this telephone number
    if (!preg_match_all("~\w~", $number, $matches))
        return false;

    // index of next digit to replace #
    $current = 0;

    // walk though each character of $format and replace #
    for ($i = 0; $i < strlen($format); $i++)
        if ($format[$i] == "#")
        {
            if (!isset($matches[0][$current]))
                // more # than numbers
                return false;

            $format[$i] = $matches[0][$current++];
        }

    if (count($matches[0]) != $current)
        // more numbers than #
        return false;

    return $format;
}

var_dump(
    formatNumber($number, $format1),
    formatNumber($number, $format2),
    formatNumber($number, $format3),
    formatNumber($number, $format4)
);

Выходы

boolean false

string '+(01)-(2)34-56 78 90' (length=20)

string '01 - 234 56 7890' (length=16)

string '012-34 56 7890' (length=14)

Если у вас есть больше #, чем цифр, вы можете просто удалить их вместо использования функции return false.Если у вас больше цифр, чем #, вы также можете добавить их в формат.

...