2

さまざまな量の配列を取り、小数点以下の桁数を揃える関数を作成しようとしました。これは、 長さが最も長い数値よりも短い長さの各数値に適切な量を追加することによって行われます。

かなり長いようですが、どうすればもっと短く効率的にできるかについて誰かが洞察を持っているのではないかと思います.

$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;
}

それはうまくいきます...本当に冗長に思えます。より短く、よりプロフェッショナルにする方法は無数にあると確信しています。アイデアをありがとう!

4

3 に答える 3

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
于 2012-07-05T15:49:12.447 に答える
2

スペースの使用はディスプレイの要件ですか? "30" が "30.000" になってもかまわない場合は、使用する小数点以下の最大桁数を計算した後、 number_formatを使用してほとんどの作業を行うことができます。

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

もう 1 つは、sprintfを使用してフォーマットすることです。

$item = "40";
$len = 10;
$temp = sprintf("%-{$len}s", $item);
$temp = str_replace(' ', '&nbsp;',$temp);
echo $temp;
于 2012-07-05T15:49:19.587 に答える
1

これを行うために、CSS の配置と一緒に HTML 要素を使用することを検討しましたか?

例えば:

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

これにより、スペースを使用して配置を手動で調整する問題が緩和されます。右揃えで、小数点以下が 2 桁あるので、小数点以下は希望どおりに並べられます。を使用してこれを行うこともでき<table>ます。両方のシナリオで、必要に応じて JS を介して完全な値を簡単に取得できます。

最後に、スペースの使用は固定幅フォントを使用していることを前提としていますが、必ずしもそうであるとは限りません。CSS アライメントを使用すると、これをより雄弁に処理できます。

于 2012-07-05T15:48:48.413 に答える