Página 1 de 1

Separador de miles

NotaPublicado: 2005-11-03 09:42 @446
por Ultrix
Hola.

Estoy comenzando con Perl y tengo el siguiente problema:

Si tengo la siguiente variable:
$a = "12345678";

y quiero dejarla con separadores de miles, como:

$a = "12,345,678";

¿Cómo puedo hacer esto?

Muchas gracias.

NotaPublicado: 2005-11-03 09:46 @449
por monoswim
Seguramente se puede hacer con expresiones regulares... En este sitio tenés dos tutoriales muy buenos al respecto...

Espero que te sirva,

Saludos

NotaPublicado: 2005-11-03 12:09 @548
por explorer39
Podrías también hacer un bucle para toda la longitud del número, contando de 3 en 3 y agregando el carácter del separador de miles.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $x = "12345678.344";
  2. $num = int($x);                          # Nos quedamos con la parte entera
  3. $dec = rindex($x,".");                   # Buscamos dónde empieza la parte decimal
  4. $n = join "",reverse split //, $num;     # Damos la vuelta al número
  5. $m = "";                                 # Aquí guardaremos el resultado
  6. while ($n =~ m/(\d{1,3})/g )             # Para todo el número, buscamos bloques de entre 1 y 3 dígitos
  7. {
  8.     $m .= "$1,";                         # Guardamos ese bloque más un separador de miles
  9. }
  10. $m = join "",reverse split //, $m;       # Volvemos a dar la vuelta al calcetín. Perdón, al número
  11. $m = substr( $m,1);                      # Quitamos el último separador de miles, pues sobra
  12. print $m;                                # Pintamos la parte entera, con los separadores
  13. print substr($x,$dec) unless $dec == -1; # Pintamos los decimales si existían
  14. print "\n";
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4

Otra forma es utilizando substr() en el lado izquierdo.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $x = "56789";
  2.  
  3. # Bucle para toda la longitud del número, empezando en la parte derecha, menos 3 (primer bloque de dígitos)
  4. # y viendo cada 3 dígitos hacia la parte izquierda
  5. for( $i=length($x)-3; $i>0; $i-=3 )
  6. {
  7.     # En esa posición metemos un separador de miles
  8.     substr($x,$i,0) = ",";
  9. }
  10. print "$x\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Otra forma es usando printf() con el modificador ('). Por ejemplo, printf("%'.2f", 1234567.89) con el locale puesto a da_DK genera 1.234.567,89.

Lo malo es que esto no funciona en todos los sistemas.

Otra forma... con un módulo... Number::Format:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Number::Format;
  2. my $numero = "123456789";
  3. my $formato = new Number::Format(
  4.     -thousands_sep   => '.',
  5.     -decimal_point   => ',',
  6. );
  7. my $formateado = $formato->format_number($numero);
  8. print $formateado,"\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Separador de miles

NotaPublicado: 2005-11-03 13:35 @607
por Ultrix
Gracias, explorer39... Viendo lo del .pm me decidí por esto... y funciona bien...

Bye...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

$num = "123456789";
print "El Número que quiero procesar es: $num\n";

$integer = '0'x(3 - (length($num) % 3)).$num;

$integer = join(",", grep {$_ ne ''} split(/(...)/, $integer));

$integer =~ s/^0+//;
$integer =~ s/^\,//;

print "Resultado: [$integer]\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Re: Separador de miles

NotaPublicado: 2014-01-25 15:25 @684
por explorer
Expresión regular para formatear "a mano" un número agrupando por los millares:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $pop = 316792343.5678;
  2. $pop =~ s/(?<!\.)(?:\b|\G)\d+?\K(?=(?:\d\d\d)+\b)/ /g;
  3.  
  4. say "[$pop]";    # [316 792 343.5678]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sacada del libro "Mastering Perl", 2Ed., O'Reilly, 2º capítulo.