2009-08-19 24 views
11

Tengo un número y necesito agregarle un decimal para formatearlo.¿Cómo puedo insertar un punto decimal antes de los últimos tres dígitos de un número?

El número está garantizado entre 1000 y 999999 (he cubierto las otras posibilidades de otras formas, esta es la que no entiendo). Tengo que poner un decimal antes de los 3 últimos dígitos, por ejemplo:

1000 -> 1.000 
23513 -> 23.513 
999999 -> 999.999 

¿Cómo puedo hacer esto?

+5

Las expresiones regulares son una herramienta versátil, pero no son la * única * herramienta. ¿Qué te hace estar tan seguro de que son la herramienta adecuada para formatear un número? –

+4

advertencia grande con este. Usar una expresión regular puede llevar a comportamientos inesperados si manipulas los números en Perl. En mi máquina, si hago 'my $ num = 11745.041 - 11739.7; print $ num; ', emite:" 5.34099999999853 ". La aplicación de la expresión regular enumerada en la respuesta aceptada de Adam antes de la declaración de impresión cambia eso a "5.34099999999.853". Probablemente no sea lo que estás buscando. Usando '$ num = sprintf ('%. 3f', $ num);' como la respuesta de @draegtun, produce el esperado: "5.341". –

Respuesta

10
$num =~ s/(\d{3})$/.$1/ 

que dice: Tomar un bloque de 3 dígitos (que debe ser anclado en el extremo de la cuerda) y reemplazarlos con un "." seguido de lo acaba emparejado.

+4

Esta no es la mejor respuesta; ver a continuación la respuesta de Draegtun, que es preferible. – Ether

+2

En realidad, * es * la mejor respuesta a la pregunta formulada, aunque posiblemente no sea la mejor manera de realizar la tarea. La pregunta específicamente solicitó una expresión regular. –

14

Aquí hay otra solución justa para la diversión:

En Perl substr() puede ser un valor-I que puede ayudar en su caso.

substr ($num , -3 , 0) = '.'; 

agregará un punto antes de los últimos tres dígitos.

También puede utilizar la versión de cuatro argumentos de la subcadena (como se señaló en los comentarios) para obtener el mismo efecto:

substr($num, -3, 0, '.'); 

yo espero que sea más elegante/legible que la solución expresión regular, pero Estoy seguro de que arrojará a alguien que no esté acostumbrado a que substr() se use como valor l.

+1

¡Es una solución genial! –

+2

Mejor escrito como "' substr ($ num, -3, 0, '.'); '" –

+0

¡Eso es increíble! – Axeman

44

Y sin embargo, otra forma de diversión ;-)

my $num_3dec = sprintf '%.3f', $num/1000; 
+9

Creo que esto expresa muy claramente el significado de los datos de entrada, y debe evitarse en favor de algo más misterioso :-) – Roboprog

+11

+1 Esta es la respuesta correcta a la pregunta. El hecho de que el OP creyó erróneamente que se necesitaba una sustitución de regex no cambia eso. –

+4

No, esta no es necesariamente * la * respuesta correcta a la pregunta. Si tiene un 64 bit perl y un número de más de 15 dígitos, esta puede ser la respuesta incorrecta, mientras que la substr o s /// siempre funcionará. – ysth

2

Golf cualquier persona?

substr $num,-3,0,'.'; 
2

¿Echo a perder algo aquí? Si tiene un número entre 999999 y 1000 que debería representar un número entre 999.999 y 1.000, debería poder:

$ num/= 1000.000;

/PF

1

¿Qué le parece esto?

$num = reverse $num; 
$num =~ s/\d{3}(?=\d)/$&./g; 
$num = reverse $num; 
Cuestiones relacionadas