2009-08-19 6 views
11

Ich habe eine Nummer und muss für die Formatierung eine Dezimalzahl hinzufügen.Wie kann ich einen Dezimalpunkt vor den letzten drei Ziffern einer Zahl einfügen?

Die Nummer ist garantiert zwischen 1000 und 999999 (Ich habe die anderen Möglichkeiten auf andere Weise abgedeckt, das ist der, den ich nicht verstehen kann). Ich brauche eine Dezimalzahl vor den letzten drei Ziffern zu setzen, zum Beispiel:

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

Wie kann ich das tun?

+5

Reguläre Ausdrücke sind ein vielseitiges Werkzeug, aber sie sind nicht das * einzige * Werkzeug. Was macht Sie so sicher, dass sie das richtige Werkzeug zum Formatieren einer Nummer sind? –

+4

Große Warnung mit diesem. Die Verwendung eines regulären Ausdrucks kann zu einem unerwarteten Verhalten führen, wenn Sie die Zahlen in Perl manipulieren. Auf meiner Maschine, wenn ich 'my $ num = 11745.041 - 11739.7; print $ num; ', es gibt aus:" 5.34099999999853 ". Das Anwenden der Regex, die in Adams akzeptierter Antwort aufgelistet ist, bevor die print-Anweisung geändert wird, ändert diese in "5.34099999999.853". Wahrscheinlich nicht das, wonach du suchst. Mit '$ num = sprintf ('%. 3f', $ num);' wie die Antwort von @draegtun, ergibt sich das erwartete: "5.341". –

Antwort

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

, der sagt: Nehmen Sie einen Block von 3 Ziffern (die am Ende des Strings verankert werden muss) und ersetzen sie durch eine „.“, gefolgt von was auch immer war gerade abgestimmt.

+4

Dies ist nicht die beste Antwort; siehe unten für die Antwort von draegtun, die vorzuziehen ist. – Ether

+2

Eigentlich * ist * die beste Antwort auf die Frage, die gestellt wurde, obwohl möglicherweise nicht der beste Weg, um die vorliegende Aufgabe zu erfüllen. Die Frage wurde gezielt nach einem regulären Ausdruck gefragt. –

14

Hier ist eine andere Lösung nur für den Spaß von ihm:

In Perl substr() kann ein L-Wert sein, die in Ihrem Fall helfen können.

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

fügt einen Punkt vor den letzten drei Ziffern hinzu.

Sie können auch die vier Argumente Version von substr verwenden (wie in den Kommentaren darauf) um den gleichen Effekt zu erhalten:

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

Ich würde hoffen, dass es elegantere/lesbar als die regexp Lösung ist, aber ich bin sicher, dass es jeden, der nicht an substr() gewohnt ist, als lvalue abwerfen wird.

+1

Das ist eine sehr coole Lösung! –

+2

Besser geschrieben als "' substr ($ num, -3, 0, '.'); '" –

+0

Das ist erstaunlich! – Axeman

44

Und noch eine weitere Möglichkeit für Spaß an der Sache ;-)

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

Ich denke, dass dies zu deutlich zum Ausdruck bringt Bedeutung der Eingabedaten, und sollte zugunsten etwas mysteriöser vermieden werden :-) – Roboprog

+11

+1 Dies ist die richtige Antwort auf die Frage. Die Tatsache, dass der OP irrtümlich glaubte, dass eine Regex-Substitution erforderlich sei, ändert daran nichts. –

+4

Nein, das ist nicht unbedingt * die * richtige Antwort auf die Frage. Wenn Sie ein 64bit Perl und> 15 stellige Zahlen haben, kann dies die falsche Antwort sein, während die Teilstr oder s /// immer funktionieren. – ysth

2

Golf jedermann?

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

Fehle ich hier etwas? Wenn Sie eine Zahl zwischen 999999 und 1000 haben, die eine Zahl zwischen 999.999 und 1.000 darstellen soll, dann sollten Sie nur folgendes tun können:

$ num/= 1000.000;

/PF

1

Wie wäre das?

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