Página 1 de 1

Notación científica con formato específico

NotaPublicado: 2015-05-18 16:02 @709
por zolidus
Supongamos que tenemos una serie de números como los siguientes:

86.4539
0.0023412
.23442
12.000

¿Existe alguna forma de imprimirlos con un formato de notación científica específica? Por ejemplo:

0.86453900E+02
0.23412000E-02
0.23442000E+00
0.12000000E+02

Ya que si utilizo la función printf ("%.8E" , $var), los números se imprimen como sigue:

8.6453900E+01
2.3412000E-03
2.3442000E-01
1.2000000E+01

Re: Notación científica con formato específico

NotaPublicado: 2015-05-18 18:26 @810
por explorer
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:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use v5.18;
  3. use feature 'say';
  4.  
  5. my @numeros = qw(
  6.   86.4539
  7.   0.0023412
  8.   .23442
  9.   12.000
  10.   1234.56
  11.   -32.4553
  12.   -0.0000000012345E-12
  13. );
  14.  
  15. for my $n (@numeros) {
  16.  
  17.     my $s = sprintf( "%+.8E", $n );
  18.  
  19.     my ($sig, $ent, $man, $exp ) = $s =~ /([-+])(\d+)\.(\d+)E([-+]\d+)/;
  20.  
  21.     if ($ent > 0) {
  22.    
  23.         my $le = length $ent;
  24.  
  25.         $man = substr($ent, -$le) . $man;
  26.  
  27.         $exp += $le;
  28.        
  29.         $ent = 0;
  30.     }
  31.  
  32.     my $s1 = $sig . $ent . "." . substr($man . '00000000', 0, 8) . sprintf "E%+03d", $exp;
  33.  
  34.     say $s;
  35.     say $s1;
  36.     say '';
  37. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
La salida es:
Sintáxis: [ Descargar ] [ Ocultar ]
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