Con el printf no se puede hacer (que yo sepa), ya que lo que quieres no sigue un formato estándar (no es
notación científica, ni siquiera
ingenieril).
He buscado, pero tampoco encuentro módulos Perl que hagan esto. Se debería llamar algo así como "normalized".
En fin, se puede resolver a mano:
Using perl Syntax Highlighting
#!/usr/bin/env perl
use v5.18;
use feature 'say';
my @numeros = qw(
86.4539
0.0023412
.23442
12.000
1234.56
-32.4553
-0.0000000012345E-12
);
for my $n (@numeros) {
my $s = sprintf( "%+.8E", $n );
my ($sig, $ent, $man, $exp ) = $s =~ /([-+])(\d+)\.(\d+)E([-+]\d+)/;
if ($ent > 0) {
my $le = length $ent;
$man = substr($ent, -$le) . $man;
$exp += $le;
$ent = 0;
}
my $s1 = $sig . $ent . "." . substr($man . '00000000', 0, 8) . sprintf "E%+03d", $exp;
say $s;
say $s1;
say '';
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
La salida es:
Using text Syntax Highlighting
+8.64539000E+01
+0.86453900E+02
+2.34120000E-03
+0.23412000E-02
+2.34420000E-01
+0.23442000E+00
+1.20000000E+01
+0.12000000E+02
+1.23456000E+03
+0.12345600E+04
-3.24553000E+01
-0.32455300E+02
-1.23450000E-21
-0.12345000E-20
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4