2012-10-19 13 views
5

Dzięki mojej bibliotece javascript, kończę z ciągiem, który reprezentuje liczbę. Teraz chcę utworzyć dodatek na tej liczbie, zamiast tego zamiast tego robi on ciągłe połączenie. Rozwiązanie jest łatwe ( 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), jeśli twój numer jest zawsze liczbą całkowitą. Jednak mój ciąg może być zmiennoprzecinkowy lub liczbą całkowitą, a w momencie dodawania, i nie wiem, który będzie. Czy istnieje sposób, aby upewnić się, że dodawanie odbywa się niezależnie od tego, czy jest to liczba zmiennopozycyjna czy całkowita?Jak zapewnić dodawanie javascript zamiast łączenia ciągów (nie zawsze dodając liczby całkowite)

Odpowiedz

10

Spróbuj użyć parseFloat. Zmienne wejściowe zostaną przekonwertowane na zmienne, które będą działać niezależnie od tego, czy łańcuch zawiera liczbę całkowitą czy zmiennoprzecinkową. Twój wynik zawsze będzie zmienny.

+0

chyba że jest 'NaN' – jcolebrand

+0

nie różni się od' parseInt' .... Więc –

+0

, Martwiłem się, że gdybym użył 'parseFloat()', skończyłbym z "5.0" zamiast "5", ale najwyraźniej tak nie jest? – dnc253

4

Dosyć bezpiecznie jest zawsze używać parseFloat, nawet jeśli podano liczbę całkowitą. Jeśli musisz użyć odpowiedniej konwersji, możesz match podać kropkę dziesiętną i użyć odpowiedniej funkcji.

+0

chyba że jest to "NaN" – jcolebrand

+0

Włączyłem twoją myśl do dłuższej wersji mojej odpowiedzi, robię to meczu z tym, co myślisz? – jcolebrand

+0

Tak, coś takiego mam na myśli :) –

2

Zamierzam założyć, że dodatek pływający jest wystarczający, a jeśli nie jest, to będziesz musiał kopać głębiej.

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

Aby wziąć co @Asad powiedział, możesz to zrobić w zamian:

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; 
} 

będzie to zawsze daje przynajmniej wyjście zerowe i nie powiedzieć, jeśli jeden z nich jest NaN.

+0

Na pewno lepiej jest zwrócić NaN, jeśli jest NaN? –

+0

Dobrze wiedzieć, ale nie interesuję się NaN. – dnc253

+0

idk, jaka jest specyfikacja? ;-) ... Powinieneś się zająć NaN cos, to cię ugryzie w pierwszej osobie, jaką otrzyma. – jcolebrand

0

Z jakiegoś powodu .... kto wie ???

Używanie parseFloat działa .... gdy parseInt nie ... oczywiście nie zawsze są takie same.

FWIW .... ja "dodając" elementy danych z "zaznaczone" checkboxes tutaj ...

var AddOns = 0; 

    $('.broadcast-channels').each(function(){    
     if ($(this).prop("checked")) {        
      var thisAddOn = parseFloat($(this).data('channel'));  
      AddOns = AddOns + thisAddOn;          
     }   
}); 
Powiązane problemy