将货币值数组中的小数对齐

时间:2012-07-05 15:40:43

标签: php

我尝试编写一个函数,该函数将采用不同数量的数组并对齐小数位,方法是为每个数字添加适当数量的 ,其长度小于最长的数字长度。

看起来很长一段时间,我想知道是否有人对我如何做得更深入,更有效率有所了解。

$arr = array(12, 34.233, .23, 44, 24334, 234);

function align_decimal ($arr) {
    $long = 0;
    $len = 0;


    foreach ( $arr as &$i ){
        //change array elements to string
        (string)$i;

        //if there is no decimal, add '.00'
        //if there is a decimal, add '00'
        //ensures that there are always at least two zeros after the decimal
        if ( strrpos( $i, "." ) === false  ) {
            $i .= ".00";
        } else {
            $i .= "00";
        }

        //find the decimal
        $dec = strrpos( $i, "." );

        //ensure there are only two decimals
        //$dec+3 is the decimal plus two characters
        $i = substr_replace($i, "", $dec+3);

        //if $i is longer than $long, set $long to $i
        if ( strlen($i) >= strlen($long) ) {
            $long = $i;
        }

    }

    //locate the decimal in the longest string
    $long_dec = strrpos( $long, "." );

    foreach ( $arr as &$i ) {

        //difference between $i and $long position of the decimal
        $z = ( $long_dec - strrpos( $i, "." ) );
        $c = 0;
        while ( $c <= $z  )  {
            //add a &nbsp; for each number of characters 
            //between the two decimal locations
            $i = "&nbsp;" . $i;
            $c++;
        }

    }

    return $arr;
}

它可以运行okkaaay ...看起来真的很冗长。我确信有一百万种方法可以让它更短,更专业。谢谢你的任何想法!

3 个答案:

答案 0 :(得分:2)

代码:

$array = array(12, 34.233, .23, 44, 24334, 234);;
foreach($array as $value) $formatted[] = number_format($value, 2, '.', '');
$length = max(array_map('strlen', $formatted));
foreach($formatted as $value)
{
    echo str_repeat("&nbsp;",$length-strlen($value)).$value."<br>";
}

输出:

&nbsp;&nbsp;&nbsp;12.00<br>
&nbsp;&nbsp;&nbsp;34.23<br>
&nbsp;&nbsp;&nbsp;&nbsp;0.23<br>
&nbsp;&nbsp;&nbsp;44.00<br>
24334.00<br>
&nbsp;&nbsp;234.00<br>

浏览器呈现:

   12.00
   34.23
    0.23
   44.00
24334.00
  234.00

答案 1 :(得分:2)

使用空间是显示器的要求吗?如果您不介意将“30”作为“30.000”出现,您可以使用number_format为您完成大部分工作,在您确定要使用的最大小数位数之后。

$item = "40";
$len = 10;
$temp = number_format($item,$len);
echo $temp;

另一种方法是使用sprintf格式化:

$item = "40";
$len = 10;
$temp = sprintf("%-{$len}s", $item);
$temp = str_replace(' ', '&nbsp;',$temp);
echo $temp;

答案 2 :(得分:1)

您是否考虑过将CSS元素与CSS对齐一起使用来为您执行此操作?

例如:

<div style="display:inline-block; text-align:right;">$10.00<br />$1234.56<div>

这将缓解使用空格手动调整对齐的问题。由于您正对齐并且有两个小数位,小数位将按您的意愿排列。您也可以使用<table>执行此操作,在这两种情况下,如果需要,您只需通过JS检索完整值即可。

最后,使用空格假设您使用的是固定宽度的字体,但可能不一定如此。 CSS对齐允许您更有说服力地处理这个问题。