2009-08-19 10 views
11

J'ai un nombre et j'ai besoin d'ajouter une décimale pour le formatage.Comment puis-je insérer un point décimal avant les trois derniers chiffres d'un nombre?

Le nombre est garanti entre 1000 et 999999 (j'ai couvert les autres possibilités par d'autres moyens, c'est celui que je ne peux pas comprendre). Je dois mettre une décimale avant les 3 derniers chiffres, par exemple:

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

Comment est-ce que je peux faire ceci?

+5

Les expressions régulières sont un outil polyvalent, mais elles ne sont pas l'outil * seulement *. Qu'est-ce qui vous rend si certain que c'est le bon outil pour formater un numéro? –

+4

Gros avertissement avec celui-ci. L'utilisation d'une expression régulière peut entraîner un comportement inattendu si vous manipulez les nombres dans Perl. Sur ma machine, si je fais 'my $ num = 11745.041 - 11739.7; print $ num; ', affiche:" 5.34099999999853 ". L'application de l'expression régulière listée dans la réponse acceptée d'Adam avant que l'instruction d'impression change cela à "5.34099999999.853". Probablement pas ce que vous cherchez. En utilisant $ num = sprintf ('%. 3f', $ num); 'comme la réponse par @draegtun, produit le attendu:" 5.341 ". –

Répondre

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

Cela dit: Prenez un bloc de 3 chiffres (qui doit être ancré à la fin de la chaîne) et les remplacer par un « . » suivi par tout ce qui était juste assortie.

+4

Ce n'est pas la meilleure réponse; voir ci-dessous pour la réponse de Draegtun qui est préférable. – Ether

+2

En fait, il * est * la meilleure réponse à la question qui a été posée, mais peut-être pas la meilleure façon d'accomplir la tâche à accomplir. La question demandait spécifiquement une expression régulière. –

14

Voici une autre solution juste pour le plaisir:

En Perl substr() peut être une lvalue qui peut aider dans votre cas.

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

ajoutera un point avant les trois derniers chiffres.

Vous pouvez également utiliser les quatre arguments version de substr (comme l'a dans les commentaires) pour obtenir le même effet:

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

Je l'espère, il est plus élégant/lisible que la solution de regexp, mais je Je suis sûr qu'il rejettera toute personne non habituée à substr() utilisée comme lvalue.

+1

C'est une solution très cool! –

+2

Mieux écrit comme "' substr ($ num, -3, 0, '.'); '" –

+0

C'est incroyable! – Axeman

44

Et encore une autre façon pour le plaisir de celui-ci ;-)

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

Je pense que cela exprime trop clairement le sens des données d'entrée, et devrait être évité en faveur de quelque chose de plus mystérieux :-) – Roboprog

+11

+1 Ceci est la bonne réponse à la question. Le fait que l'OP croyait à tort qu'une substitution par regex était nécessaire ne change rien à cela. –

+4

Non, ce n'est pas nécessairement * la * bonne réponse à la question. Si vous avez un Perl de 64 bits et des nombres de plus de 15 chiffres, cela pourrait bien être la mauvaise réponse, alors que le ou les substr // s fonctionneront toujours. – ysth

2

quelqu'un Golf?

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

Est-ce qu'il me manque quelque chose ici? Si vous avez un nombre entre 999999 et 1000 qui devrait représenter un nombre entre 999.999 et 1.000, vous devriez être en mesure de simplement:

$ num/= 1000.000;

/PF

1

Que pensez-vous de cela?

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