2016-03-25 10 views
5

Rozważmy następującą funkcję VBA:Czy jest to błąd w funkcjach IsNumeric i CDbl() VBA?

Function castAndAdd(inputValue As Variant) As Variant 

If IsNumeric(inputValue) Then 
    castAndAdd = CDbl(inputValue) + 4 
Else 
    castAndAdd = inputValue 
End If 

End Function 

wywołanie go z bezpośrednim okna daje to wyjście:

?castAndAdd("5,7") 
61 
?castAndAdd("5, 7") 
5, 7 

Stepping przez "5,7" rozmowy, uważam, że IsNumeric("5,7") powraca true. Myślałem, że może to daje ten wynik, ponieważ w Europie przecinek jest używany jako separator dziesiętny; ten wynik jest dziwny, ponieważ jestem w Stanach Zjednoczonych, więc moje ustawienia regionalne powinny określać, że Excel rozpoznaje tylko kropkę jako separator dziesiętny, prawda?

Nawet jeśli odłożymy na bok kwestię Europa/USA, większy problem polega na tym, że CDbl ("5,7") zwraca 57, więc CDbl("5,7") + 4 zwraca 61, a nie 9.7, tak jak bym się spodziewał, gdyby przecinek był dziesiętny separator. Czy jest to błąd, czy też po prostu nie rozumiem, jak używać CDbl()?

+0

Myślę, że 'CDbl' zastępuje', '' '" 'it.e go usuwa. – newguy

Odpowiedz

4

Przecinek nie jest rozpoznawany jako dziesiętny, ale jako separator tysięcy. Mechanizm nie jest tak inteligentny, aby wymagać, aby za nim podążały co najmniej trzy cyfry, ale zasadniczo usuwa każdy z separatorów tysięcy, interpretując go jako liczbę.

Więc nawet CDbl("4,5,,6,7") dałoby 4567 jako liczbę. Wszystko to dzieje się, gdy przecinek jest separatorem tysięcy. Jeśli, tak jak w niektórych krajach europejskich, chodzi o separator tysięcy, to samo stanie się z punktami.

+2

Wow, to ciekawy splot definicji "prawidłowo" w tym wierszu z [oficjalnej dokumentacji] (https://msdn.microsoft.com/en-us/library/office/gg278896.aspx): "różne znaki dziesiętne separatory, różne separatory tysięcy i różne opcje waluty są * odpowiednio * rozpoznawane w zależności od ustawień regionalnych twojego komputera. " – Comintern