2012-10-19 19 views
5

Thông qua thư viện javascript của tôi, tôi kết thúc bằng một chuỗi đại diện cho một số. Bây giờ tôi muốn tạo thành một bổ sung trên số đó mà không có nó làm một chuỗi nối thay thế. Giải pháp này rất dễ dàng ( How do I add an integer value with javascript (jquery) to a value that's returning a string?, How to make an addition instead of a concatenation) nếu số của bạn luôn bằng số nguyên. Tuy nhiên chuỗi của tôi có thể là một phao hoặc một số nguyên, và tại thời điểm bổ sung, và tôi không biết nó sẽ là gì. Có cách nào để đảm bảo việc bổ sung xảy ra bất kể đó là một phao hay số nguyên?Cách đảm bảo thêm javascript thay vì nối chuỗi (Không phải lúc nào cũng thêm số nguyên)

Trả lời

10

Thử sử dụng parseFloat. Các biến đầu vào sẽ được chuyển thành float, sẽ hoạt động cho dù chuỗi có chứa một số nguyên hay một float. Kết quả của bạn sẽ luôn là một phao.

+0

trừ khi đó là 'NaN' – jcolebrand

+0

Không khác nhau từ 'parseInt' .... –

+0

Vì vậy, , Tôi đã lo lắng rằng nếu tôi sử dụng 'parseFloat()' tôi sẽ kết thúc với "5.0" thay vì "5", nhưng rõ ràng đó không phải là trường hợp? – dnc253

4

An toàn là hợp lý để luôn sử dụng parseFloat ngay cả khi bạn được cung cấp một số nguyên. Nếu bạn phải sử dụng chuyển đổi thích hợp, bạn có thể match cho dấu thập phân và sử dụng hàm thích hợp.

+0

trừ khi nó 'NaN' – jcolebrand

+0

Tôi kết hợp suy nghĩ của bạn thành một phiên bản dài hơn của câu trả lời của tôi, phù hợp với những gì bạn nghĩ? – jcolebrand

+0

Yup, một cái gì đó như thế là những gì tôi có nghĩa là :) –

2

Tôi sẽ giả định rằng bổ sung float là đủ, và nếu không, thì bạn sẽ cần phải đào sâu hơn.

function alwaysAddAsNumbers(numberOne, numberTwo){ 
    var parseOne = parseFloat(numberOne), 
     parseTwo = parseFloat(numberTwo); 
    if (isNaN(parseOne)) parseOne = 0; 
    if (isNaN(parseTwo)) parseTwo = 0; 
    return parseOne + parseTwo; 
} 

Chịu gì @Asad nói, bạn có thể muốn làm điều này thay vì:

function alwaysAddAsNumbers(a, b){ 
    var m = 0, 
     n = 0, 
     d = /\./, 
     f = parseFloat, 
     i = parseInt, 
     t = isNaN, 
     r = 10; 
    m = (d.test(a)) ? f(a) : i(a,r); 
    n = (d.test(b)) ? f(b) : i(b,r); 
    if (t(m)) m = 0; 
    if (t(n)) n = 0; 
    return m + n; 
} 

này sẽ luôn luôn cung cấp cho bạn ít nhất một đầu ra không, và không cho bạn biết nếu một trong hai là NaN.

+0

Chắc chắn tốt hơn để trả lại NaN nếu một trong hai là NaN? –

+0

Thông tin cần biết, nhưng tôi không quan tâm đến NaN. – dnc253

+0

idk, spec là gì? ;-) ... Bạn nên quan tâm với NaN cos nó sẽ cắn bạn trong cơ hội đầu tiên ass nó được. – jcolebrand

0

Vì một số lý do .... ai biết ???

Sử dụng parseFloat hoạt động .... khi parseInt không ... rõ ràng chúng không phải lúc nào cũng giống nhau.

FWIW .... Tôi đang "thêm" yếu tố dữ liệu từ "kiểm tra" hộp kiểm ở đây ...

var AddOns = 0; 

    $('.broadcast-channels').each(function(){    
     if ($(this).prop("checked")) {        
      var thisAddOn = parseFloat($(this).data('channel'));  
      AddOns = AddOns + thisAddOn;          
     }   
}); 
Các vấn đề liên quan