2011-01-30 40 views
5

Tôi có đoạn mã sau:Javascript Regex: thay thế dấu chấm cuối cùng cho một dấu phẩy

var x = "100.007" 
x = String(parseFloat(x).toFixed(2)); 
return x 
=> 100.01 

này hoạt động awesomely chỉ cách tôi muốn nó hoạt động. Tôi chỉ muốn một sự bổ sung nhỏ, giống như:

var x = "100,007" 
x.replace(",", ".") 
x.replace 
x = String(parseFloat(x).toFixed(2)); 
x.replace(".", ",") 
return x 
=> 100,01 

Tuy nhiên, mã này sẽ thay thế lần xuất hiện đầu tiên của dấu ",", nơi tôi muốn bắt chữ cái cuối cùng. Bất kỳ trợ giúp sẽ được đánh giá cao.

Trả lời

15

Bạn có thể làm điều đó với một biểu thức chính quy:

x = x.replace(/,([^,]*)$/, ".$1"); 

Đó biểu thức chính quy phù hợp với một dấu phẩy theo sau bất kỳ số lượng văn bản nào không bao gồm dấu phẩy. Chuỗi thay thế chỉ là một khoảng thời gian theo sau bởi bất kỳ chuỗi ký tự nào xuất hiện sau dấu phẩy cuối cùng ban đầu. Các dấu phẩy khác trước nó trong chuỗi sẽ không bị ảnh hưởng.

Bây giờ, nếu bạn đang thực sự chuyển đổi các số được định dạng theo "kiểu châu Âu" (vì thiếu cụm từ tốt hơn), bạn cũng sẽ cần phải lo lắng về "." ký tự ở những nơi có số "kiểu Mỹ" sẽ có dấu phẩy. Tôi nghĩ rằng bạn có lẽ chỉ muốn thoát khỏi chúng:

x = x.replace(/\./g, ''); 

Khi bạn sử dụng ".replace()" chức năng trên một chuỗi, bạn nên hiểu rằng nó lợi nhuận chuỗi sửa đổi. Nó không sửa đổi các chuỗi gốc, tuy nhiên, do đó, một tuyên bố như:

x.replace(/something/, "something else"); 

không ảnh hưởng đến giá trị của "x".

+0

Hãy chắc chắn để loại bỏ các ký tự thời gian của bạn TRƯỚC KHI chuyển đổi dấu phẩy của bạn thành một hoặc bạn sẽ kết thúc với một số hoàn toàn khác nhau! Phải có một regex ra có chuyển đổi thời gian chỉ khi họ được theo sau bởi một dấu phẩy và chuyển đổi dấu phẩy chỉ nếu nó được đi trước bởi thời gian ... Hãy suy nghĩ tôi đã chỉ tìm thấy những gì tôi đang làm với giờ ăn trưa của tôi ... – RyanfaeScotland

2

Bạn có thể làm điều đó bằng cách sử dụng chức năng lastIndexOf() để tìm sự xuất hiện cuối cùng của , và thay thế nó.

Cách khác là sử dụng một biểu thức chính quy với thời điểm cuối dòng đánh dấu:

myOldString.replace(/,([^,]*)$/, ".$1"); 
+0

Tính năng này có hoạt động không? Chữ ',' đầu tiên sẽ có một dòng kết thúc ở đâu đó sau nó. – GolezTrol

0

Bạn không cần phải lo lắng về việc đó có phải là "cuối cùng" hay không., Bởi vì chỉ có một. JavaScript không lưu trữ số nội bộ bằng các tập hợp dấu phẩy hoặc dấu chấm.

+0

Quy tắc số một là không bao giờ tin tưởng đầu vào.Vì vậy, tôi lo lắng :) Không bao giờ ít cảm ơn bạn cho câu trả lời của bạn. – Shyam

+0

Đầu vào không quan trọng - bạn đang chạy 'replace' trên đầu ra của' String (parseFloat (n) .toFixed (2)) ', sẽ luôn trả về một chuỗi đại diện của một trong hai' nil' hoặc một số với một dấu thập phân đơn và dấu phẩy bằng không. JavaScript sẽ KHÔNG BAO GIỜ chuyển đổi một số thành một chuỗi có dấu phân cách bằng dấu phẩy trừ khi bạn viết một phương thức để làm điều đó một cách cụ thể. – coreyward

1

Bạn có thể sử dụng lastIndexOf để tìm sự xuất hiện cuối cùng của ,. Sau đó, bạn có thể sử dụng slice để đặt một phần trước và sau , cùng với một sự gắn kết ..

+0

Chẳng phải regex sẽ tốt hơn, vì nó là một sự phù hợp với mẫu mà tôi đang tìm kiếm? – Shyam

1

Bạn có thể sử dụng regexp. Bạn muốn thay thế ',', vì vậy ý ​​tưởng cơ bản là thay thế ',' mà sau đó không có ','.

x.replace(/,([^,]*)$/, ".$1"); 

Sẽ trả về những gì bạn muốn :-).

Các vấn đề liên quan