2009-08-19 42 views
11

Tôi có một số và cần phải thêm một số thập phân vào số đó để định dạng.Làm cách nào để chèn dấu thập phân trước ba số cuối của một số?

Số được đảm bảo trong khoảng từ 1000 đến 999999 (tôi đã đề cập đến các khả năng khác theo những cách khác, đây là điều tôi không thể làm được). Tôi cần phải đặt một số thập phân trước 3 chữ số cuối, ví dụ:

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

Làm cách nào để thực hiện việc này?

+5

Cụm từ thông dụng là công cụ đa năng, nhưng chúng không phải là công cụ * duy nhất *. Điều gì làm cho bạn chắc chắn rằng họ là công cụ thích hợp để định dạng một số? –

+4

Cảnh báo lớn với điều này. Sử dụng cụm từ thông dụng có thể dẫn đến một số hành vi không mong muốn nếu bạn đang thao tác các số trong perl. Trên máy của tôi, nếu tôi làm 'my $ num = 11745.041 - 11739,7; in $ num; ', nó xuất ra:" 5.34099999999853 ". Áp dụng regex được liệt kê trong câu trả lời được chấp nhận của Adam trước khi câu lệnh in thay đổi thành "5.34099999999.853". Có lẽ không phải những gì bạn đang tìm kiếm. Sử dụng '$ num = sprintf ('%. 3f', $ num);' giống như câu trả lời của @draegtun, tạo ra dự kiến: "5.341". –

Trả lời

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

Đó nói: Hãy khối 3 chữ số (mà phải được neo vào cuối chuỗi) và thay thế bằng một "." theo sau bởi bất cứ điều gì chỉ phù hợp.

+4

Đây không phải là câu trả lời hay nhất; xem dưới đây cho phản ứng của draegtun thích hợp hơn. – Ether

+2

Thực ra nó * là câu trả lời hay nhất cho câu hỏi đã được hỏi, mặc dù có thể không phải là cách tốt nhất để hoàn thành nhiệm vụ trong tầm tay. Câu hỏi đặc biệt được yêu cầu cho một biểu thức chính quy. –

14

Dưới đây là một giải pháp chỉ dành riêng cho những niềm vui của nó:

Trong Perl substr() có thể là một giá trị trái mà có thể giúp đỡ trong trường hợp của bạn.

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

sẽ thêm dấu chấm trước ba số cuối.

Bạn cũng có thể sử dụng phiên bản bốn đối số của substr (như được chỉ trong các ý kiến) để có được hiệu quả tương tự:

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

tôi sẽ hy vọng nó là tao nhã hơn/dễ đọc hơn so với giải pháp regexp, nhưng tôi chắc chắn nó sẽ ném ra bất cứ ai không được sử dụng để substr() được sử dụng như một lvalue.

+1

Đó là một giải pháp rất tuyệt vời! –

+2

Tốt hơn được viết là "' substr ($ num, -3, 0, '.'); '" –

+0

Thật tuyệt vời! – Axeman

44

Và một cách khác cho niềm vui của nó ;-)

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

Tôi nghĩ rằng điều này quá rõ ràng thể hiện ý nghĩa của dữ liệu đầu vào, và nên tránh để ủng hộ điều gì đó bí ẩn hơn :-) – Roboprog

+11

+1 Đây là câu trả lời đúng cho câu hỏi. Thực tế là OP nhầm lẫn tin rằng một sự thay thế regex là cần thiết không thay đổi điều đó. –

+4

Không, đây không nhất thiết là * câu trả lời đúng cho câu hỏi. Nếu bạn có số 64 bit perl và> 15 chữ số, đây có thể là câu trả lời sai, trong khi chất nền hoặc s /// sẽ luôn hoạt động. – ysth

2

Tôi có thiếu gì đó ở đây không? Nếu bạn có số từ 999999 đến 1000 phải là số từ 999.999 đến 1.000, bạn sẽ có thể chỉ:

$ num/= 1000.000;

/PF

1

Làm thế nào về điều này?

$num = reverse $num; 
$num =~ s/\d{3}(?=\d)/$&./g; 
$num = reverse $num; 
Các vấn đề liên quan