2010-07-08 9 views

Trả lời

15

Không. Xóa dấu phẩy.

+7

Đây không phải là câu trả lời của câu trả lời dưới đây thực sự giúp ích cho bạn. http://stackoverflow.com/a/3205751/111757 – Vicer

+2

@Vicer: Nói đúng, câu trả lời * của 999 không phải là câu trả lời cho câu hỏi cụ thể * này: OP đã biết cách xóa dấu phẩy khỏi chuỗi và hỏi liệu một kỹ thuật khác có tồn tại không. Và câu trả lời là "không". Đối với những người trong tương lai, những người đi theo những người * không * biết cách loại bỏ dấu phẩy, mặc dù câu trả lời của 999 chắc chắn hữu ích hơn, ngay cả khi nó không thực sự trả lời câu hỏi gốc. Nhưng, này. Vì những người duy nhất sẽ truy cập trang này nữa là Googling cách xử lý các con số bằng dấu phẩy, nên anh ấy chắc chắn là câu trả lời tốt hơn cho tất cả người xem trong tương lai. – Matchu

+2

@Matchu Không nhất thiết, tôi đã tìm kiếm một câu trả lời rất ngắn gọn (tôi đoán, về mặt kỹ thuật, tôi có cùng câu hỏi với OP). Trong trường hợp của tôi câu trả lời của bạn là một bài tập về tính chính xác và ngắn gọn (OP dường như đồng ý). Dù sao, chỉ cần nói cho một số người trong chúng ta "người xem trong tương lai", câu trả lời này vẫn tốt hơn so với 999 (do đó tôi upvote). Tôi hy vọng rằng nếu ai đó không biết cách thay thế dấu phẩy, họ sẽ Google và không bao giờ thấy trang này trong tất cả khả năng. Trong trường hợp của tôi, mặc dù tôi đã google và thấy tiêu đề của trang này trùng khớp, khá chặt chẽ, văn bản tìm kiếm của tôi. Thnx! – VoidKing

72
parseFloat(theString.replace(/,/g,'')); 
+17

Vui lòng không sử dụng regex. '.replace (',', '')' – Dogbert

+0

Ông cũng đặc biệt nói rằng ông coi việc loại bỏ dấu phẩy, nhưng quan tâm đến những cách khác –

+26

@Adam, giả sử số là 1 triệu, "1.000.000", nếu bạn không Không sử dụng regex với cờ toàn cầu, chỉ dấu phẩy đầu tiên mới được thay thế -> '" 1000.000 "'. – CMS

6

Bạn có thể sử dụng phương thức thay thế chuỗi, nhưng không được sử dụng trong một lớp lót như regexp cho phép.

while(str.indexOf(',')!=-1)str= str.replace(',',''); 
parseFloat(str); 

Hoặc để tạo ra một biểu thức duy nhất mà không có một regexp =

return parseFloat(str.split(',').join('')); 

Tôi muốn sử dụng regexp.

0

xây dựng trên ý tưởng từ @kennebec, nếu bạn muốn chắc chắn rằng dấu phẩy là chính xác, và bạn không muốn thay thế dấu phẩy, bạn có thể thử một cái gì đó như thế này:

function myParse(num) { 
    var n2 = num.split(",") 
    out = 0 
    for(var i = 0; i < n2.length; i++) { 
    out *= 1000; 
    out += parseFloat(n2[i]) 
    } 
    return out 
} 
alert(myParse("1,432,85")); 
// Returns 1432085, as the comma is misplaced. 

Nó có thể không được nhanh, nhưng bạn muốn lựa chọn thay thế :)

0

Điều gì về một chức năng đơn giản để giải quyết hầu hết các vấn đề thường gặp?

function getValue(obj) { 
    Value = parseFloat($(obj).val().replace(/,/g,'')).toFixed(2); 
    return +Value; 
} 

Hàm trên nhận giá trị từ trường (sử dụng jQuery) giả sử giá trị đã nhập là số (tôi thay vì xác thực trường khi người dùng nhập dữ liệu, vì vậy tôi biết chắc chắn nội dung trường là số).

Trong trường hợp giá trị dấu phẩy động, nếu được định dạng tốt trong trường, hàm sẽ trả về giá trị dấu phẩy chính xác.

Chức năng này còn xa mới hoàn thành, nhưng nó nhanh chóng khắc phục vấn đề "," (dấu phẩy) cho các giá trị nhập như 1,234.56 hoặc 1.234.567. Nó sẽ trả lại số hợp lệ cho đến nay nội dung là số.

Dấu hiệu + (cộng) ở phía trước của biến Value trong trở lệnh là một "bẩn lừa" được sử dụng trong hoạt Javascript để đảm bảo nội dung biến trở sẽ số.

nó rất dễ dàng để thay đổi chức năng để các mục đích khác, chẳng hạn như (ví dụ), chuyển đổi xâu kí tự sang giá trị số chăm sóc "," (dấu phẩy) vấn đề:

function parseValue(str) { 
    Value = parseFloat(str.replace(/,/g,'')).toFixed(2); 
    return +Value; 
} 

Cả hai hoạt động này thậm chí có thể được kết hợp trong một hàm. I E.:

function parseNumber(item,isField=false) { 
    Value = (isField) ? parseFloat($(item).val().replace(/,/g,'')).toFixed(2) : parseFloat(item.replace(/,/g,'')).toFixed(2) 
    return +Value; 
} 

Trong trường hợp như vậy, nếu hàm được gọi result = parseNumber ('12, 092,98'); nó sẽ phân tích giá trị vì nó là một Chuỗi. Nhưng nếu được gọi là result = parseNumber ('# MyField', true); nó sẽ cố gắng để có được giá trị từ '#MyField'.

Như tôi đã nói trước đây, các chức năng như vậy sẽ không hoàn chỉnh và có thể được mở rộng theo nhiều cách. Một ý tưởng là kiểm tra ký tự đầu tiên của tham số đã cho (chuỗi) và quyết định dựa trên định dạng chuỗi để lấy giá trị được phân tích cú pháp (nếu ký tự đầu tiên là = '#' thì nó là một ID từ đối tượng DOM , nếu không, nếu bắt đầu bằng một số, thì phải là một số chuỗi để được phân tích cú pháp).

Hãy dùng thử ... Mã hóa vui vẻ.

14

Tôi không biết lý do tại sao không có ai đã gợi ý này expression-

parseFloat(theString.replace(/[^\d\.]/g,'')); 

Loại bỏ bất kỳ ký tự không phải số trừ giai đoạn. Bạn không cần các chức năng tùy chỉnh/vòng lặp cho điều này, đó chỉ là quá mức cần thiết.

+0

giải pháp đơn giản nhất! – Ray

+1

Cảm ơn! Điều này đã chăm sóc của "$" là tốt. Câu trả lời hay :-) – hardba11

2

tôi không có đủ uy tín để thêm một bình luận, nhưng đối với bất cứ ai tự hỏi về việc thực hiện cho regex vs chia/tham gia, đây là một fiddle nhanh: https://jsfiddle.net/uh3mmgru/

var test = "1,123,214.19"; 

var t0 = performance.now(); 
for (var i = 0; i < 1000000; i++) 
{ 
    var a = parseFloat(test.replace(/,/g,'')); 
} 
var t1 = performance.now(); 
document.write('Regex took: ' + (t1 - t0) + ' ms'); 
document.write('<br>') 

var t0 = performance.now(); 
for (var i = 0; i < 1000000; i++) 
{ 
    var b = parseFloat(test.split(',').join('')); 
} 
var t1 = performance.now(); 
document.write('Split/join took: ' + (t1 - t0) + ' ms'); 

Kết quả tôi nhận được là (cho 1 triệu vòng mỗi):

regex: 263,335 ms
Split/tham gia: 1035,875 ms

Vì vậy, tôi nghĩ rằng nó an toàn để nói regex đó là con đường để đi trong kịch bản này