• Publicidad

Separador de miles

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Separador de miles

Notapor Ultrix » 2005-11-03 09:42 @446

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.
Ultrix
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2005-11-03 09:36 @441

Publicidad

Notapor monoswim » 2005-11-03 09:46 @449

Seguramente se puede hacer con expresiones regulares... En este sitio tenés dos tutoriales muy buenos al respecto...

Espero que te sirva,

Saludos
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

Notapor explorer39 » 2005-11-03 12:09 @548

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.003 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
Última edición por explorer39 el 2005-11-05 13:56 @622, editado 2 veces en total
explorer39
 

Separador de miles

Notapor Ultrix » 2005-11-03 13:35 @607

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
Ultrix
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2005-11-03 09:36 @441

Re: Separador de miles

Notapor explorer » 2014-01-25 15:25 @684

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 6 invitados