2012-03-27 21 views
1

基于使用散列符号,减号和空格的另一个输入字符串来格式化字符串的最简单方法是什么?使用散列符号格式化数字的类或函数

我有什么是包含可能是这样的,一个电话号码(或有多个空格的话)一个字符串:

012-34567890 

我有一个包含该数字必须是格式另一个字符串转换成,这看起来像这样:

### - ## ## ## 

## - ### ## ## 

###-## ## ## 

散列位置必须领先于数字的格式。我似乎无法想到这样做...

在某些情况下(如国际电话号码)必须使用(,)和+符号。在这种情况下,转换字符串看起来像这样(例如)

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

任何任何想法?

回答

3
$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。如果您的位数多于#,您还可以将它们附加到格式中。