2012-07-05 2 views
2

J'ai essayé d'écrire une fonction qui va prendre un tableau de montants différents et aligner les décimales, en ajoutant la quantité appropriée de   à chaque nombre avec une longueur moindre que le nombre avec la plus longue longueur. Cependant, cela semble assez long, et je me demande si quelqu'un a un aperçu de ce que je pourrais faire est plus court et plus efficace.aligner les nombres décimaux dans le tableau des valeurs monétaires

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

cela fonctionne okkaaay ... semble vraiment vraiment verbeux. Je suis sûr qu'il y a un million de façons de le rendre beaucoup plus court et plus professionnel. Merci pour vos idées!

Répondre

2

code:

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

Sortie:

&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> 

par navigateur Rendus:

12.00 
    34.23 
    0.23 
    44.00 
24334.00 
    234.00 
+0

c'est beaucoup plus court! Merci! – 1252748

+0

Cela nécessite d'utiliser une police de caractères avec des chiffres à espacement fixe et un nbsp qui correspond à sa largeur. Si vous avez besoin d'aligner des nombres dans la table HTML, j'ai créé un simple plugin jQuery sans ces restrictions: https://github.com/ndp/align-column. – ndp

1

Avez-vous envisagé d'utiliser des éléments HTML avec l'alignement CSS pour le faire pour vous?

Par exemple:

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

Cela allègerait la question de l'utilisation des espaces pour régler manuellement l'alignement. Puisque vous vous alignez à droite et qu'il y a deux décimales, les décimales s'aligneront comme vous le souhaitez. Vous pouvez également le faire en utilisant un <table> et dans les deux scénarios, vous pouvez simplement récupérer la valeur complète via JS si besoin est. Enfin, l'utilisation d'espaces suppose que vous utilisez une police à largeur fixe, ce qui n'est pas forcément le cas. L'alignement CSS vous permet de gérer cela de façon beaucoup plus éloquente.

+0

merci. Bien que css puisse être utilisé pour accomplir une sorte de même idée, je préfère utiliser php pour le script. – 1252748

2

utilise un espace une exigence pour l'affichage? Si cela ne vous dérange pas d'avoir "30" comme "30.000" vous pouvez utiliser le number_format pour faire la plupart du travail pour vous, après avoir déterminé le nombre maximum de décimales à utiliser.

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

Une autre solution serait d'utiliser sprintf au format:

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