Private Function IsNumeric_r338v2(ByVal str As String) As Boolean
Dim cReg As Object
Set cReg = CreateObject("VBScript.RegExp")
str = Trim$(str)
With cReg
' Testeamos con . como separador de miles y , como separador de decimales
' Personalmente seria para mi "^-?(?:\d{1,3}(?:\.\d{3})*|\d+)(?:\,\d+)?$"
' ya que 133.23.330 no es un numero aunque IsNumeric diga que si ¬¬
.Pattern = "^[+\-]?(?:\d{1,3}(?:\.\d{1,3})*|\d*)\,?\d*?$"
.Global = True
.IgnoreCase = True
End With
IsNumeric_r338v2 = cReg.Test(str)
If Not IsNumeric_r338v2 Then
While InStr(str, "..")
str = Replace$(str, "..", vbNullString)
Wend
' Testeamos con , como separador de miles y . como separador de decimales
cReg.Pattern = "^[+\-]?(?:\d{1,3}(?:\,\d{3})*|\d+)\.?\d*$"
IsNumeric_r338v2 = cReg.Test(str)
End If
Set cReg = Nothing
End Function
Obviamente ya no es la mas rápida, lo arregle para los caprichos de IsNumeric (desde cuando 1..2..3 es un numero?!!!)
sTest IsNumeric_r338 IsNumeric CDbl(sTest)
1..3 Verdadero Verdadero 13
+33.2 Verdadero Verdadero 332
11111111111111111111 Verdadero Verdadero 1,11111111111111E+19
12,12 Verdadero Verdadero 12,12
12.12 Verdadero Verdadero 1212
133.23.330 Verdadero Verdadero 13323330
36.658,30 Verdadero Verdadero 36658,3
81,838.59 Verdadero Verdadero 81,83859
-65,1 Verdadero Verdadero -65,1
12,23,34 Falso Falso
asdf Falso Falso
a12f Falso Falso
1..1 Verdadero Verdadero 11
1,,1 Falso Falso
1..2..3 Verdadero Verdadero 123