Jonathan Beliën

Jonathan Beliën

Freelance Web Developer

« Spécialiste » en cartographie numérique
Membre du conseil d'administration d'OpenStreetMap Belgique
Membre d'Open Labs (Albanie)
Fan de LEGO et de bande-dessinées
Photographe amateur



PHP: Formater un nombre en notation ingénieur

Publié le 10.11.2011

Il existe, en PHP, un moyen simple d’afficher un nombre en notation scientifique (ex. : 1.2e+2) avec la fonction sprintf :

echo sprintf('%e', $n);

Mais il n’existe pas de moyen simple d’afficher un nombre en notation ingénieur (ex. : 12.0e+3), j’ai donc créé une fonction qui retourne un nombre quelconque en notation ingénieur :

function number_format_eng($value, $digits = 3) {
    if ($value == 0.0) return '0.' . str_repeat(0, $digits) . 'E+00';

    $sign = ($value < 0 ? '-' : '');
    $num = abs($value);

    $e = floor( log($num) / log(1000) );
    $mult = pow(1000, $e);
    $num = adjust($num / $mult);

    return $sign . number_format($num, $digits, '.', '') . 'E' . ($e >= 0 ? '+' : '-') . str_pad(abs($e * 3), 2, 0, STR_PAD_LEFT);
}

function adjust($value) {
    if ($value < 1) {
        return 1;
    }
    else if (($value < 10) and ($value > 9.999999999)) {
        return 10;
    }
    else if (($value < 100) and ($value > 99.99999999)) {
        return 100;
    }
    else {
        return $value;
    }
}

Le paramètre value correspond à vote nombre à formater en notation ingénieur. Le paramètre digits correspond au nombre de chiffres que vous voulez après la virgule.

Mise à jour 05.01.2012 : La fonction proposée jusqu’ici ne retournait pas toujours le bon résultat. La version proposée à présent est une adaptation de la fonction de Gene Sullivan : http://search.cpan.org/~gsullivan/Number-FormatEng-0.01/lib/Number/FormatEng.pm