Se trabajan las funciones a nivel Bit, ambas funciones son mas rapidas que la nativa en vb6.
Funcion en VB6
Codigos para descargar...
Archivos Fuente dll, y Compilados
La funcion isnumeric_Black esta en VB6, es la version en vb6 de la que esta aqui...
Código:
http://foro.elhacker.net/programacion_visual_basic/reto_reemplazo_de_funcion_isnumeric-t336067.0.html;msg1652210#msg1652210
main.cpp
y aqui les dejo la traduccion en C (Las funciones IsNumericA y IsNumericW estan configuradas para trabajar con las Strings de VB6)
Código
#include "main.h" /** @Autor BlackZeroX @Web http://infrangelux.sytes.net/blog/ @Reference http://foro.elhacker.net/programacion_visual_basic/reto_reemplazo_de_funcion_isnumeric-t336067.0.html;msg1652210#msg1652210 @Description Libreria para verificar si una Cadena de texto ANSI/UNICODE es numerica con los siguientes formatos: * ###e[+/-]### {+/-646.45e+546,45}. * ###d[+/-]### {+/-646.45d+546,45}. * Base 16 {&H4561abcdef}. * Base 10 {+/-456,541.456,545}. @Returns 0 si la cadena no contiene ningun formato. 1 si la cadena pertenece a algun tipo de formato numerico. **/ #define PUNTO_DECIMAL 0x10000 #define SIGNO_SRC 0x20000 #define NUMBER_HEX 0x40000 #define NUMBER_HEX_ZERO 0x80000 #define NUMBER_HEX_FLAGS (NUMBER_HEX | NUMBER_HEX_ZERO) #define NUMBER_POW 0x100000 #define NUMBER_POW_FINISH 0x200000 #define NUMBER_POW_FLAGS (NUMBER_POW | NUMBER_POW_FINISH) #define NUMBER_OF_OK 0x400000 #define NUMBER_OF_FINISH 0x800000 #define NUMBER_OF_FLAGS (NUMBER_OF_OK | NUMBER_OF_FINISH) DLL_EXPORT int __stdcall IsNumericA (char *pStr) { return pStr ? IsNumericEx(pStr, *((int*)(pStr - 0x4)), 1): 0; } DLL_EXPORT int __stdcall IsNumericW (char *pStr) { return pStr ? IsNumericEx(pStr, *((int*)(pStr - 0x4)), 2): 0; } int IsNumericEx (char *pStr, size_t uiLn, int iStep) { unsigned int i = 0x0, // For() iData = 0x0; // Xor, Switcher, Contador (QWord). if (!pStr || !uiLn) return 0; for (i = 0; i < uiLn; i += iStep) { if ((iData & NUMBER_HEX) == NUMBER_HEX) { if (((*pStr >= 0x30) && (*pStr <= 0x39)) || ((*pStr >= 0x61) && (*pStr <= 0x66)) || ((*pStr >= 0x41) && (*pStr <= 0x46))) { // Numeros Hexadecimales if ((iData & NUMBER_OF_FLAGS) == 0x0) // Ceros a la izquierda iData |= (*pStr == 0x30) ? NUMBER_HEX_ZERO : NUMBER_OF_OK; switch (iData & NUMBER_OF_FLAGS) { case NUMBER_OF_OK: iData++; if ((iData & 0xFF) == 0x11) return 0; // QWord (Max Double) iData |= NUMBER_OF_OK; if ((iData | NUMBER_HEX_FLAGS) == NUMBER_HEX_FLAGS) iData ^= NUMBER_HEX_ZERO; break; case NUMBER_OF_FINISH: case NUMBER_OF_FLAGS: return 0; break; } } else { switch (*pStr) { case 0x9: case 0xA: case 0xB: case 0xC: case 0xD: case 0x24: case 0x20: case 0xA0: // Espacios en Blanco if ((iData | NUMBER_HEX_FLAGS) == NUMBER_HEX_FLAGS) iData = ((iData ^ NUMBER_HEX_ZERO) | NUMBER_OF_OK); if ((iData & NUMBER_OF_FLAGS) == NUMBER_OF_OK) iData |= NUMBER_OF_FINISH; break; case 0x0: // NULL Indica que se termina la cadena. if ((iData & NUMBER_OF_FLAGS) == NUMBER_OF_FINISH) return 0; i = uiLn; // Exit For. break; default: return 0; break; } } } else { if ((*pStr >= 0x30) && (*pStr <= 0x39)) { iData |= NUMBER_OF_OK; if ((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH) return 0; if ((iData & NUMBER_POW_FLAGS) == NUMBER_POW) iData |= NUMBER_POW_FINISH; } else { switch ((int)*pStr) { case 0x0: // NULL Indica que se termina la cadena. if ((iData & NUMBER_POW_FLAGS) == NUMBER_POW) return 0; i = uiLn; // Exit For. break; case 0x2E: // "." Solo 1 if (((iData & NUMBER_POW_FLAGS) == NUMBER_POW) || ((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH) || ((iData & PUNTO_DECIMAL) == PUNTO_DECIMAL)) return 0; iData |= PUNTO_DECIMAL; break; case 0x2B: case 0x2D: // "+|-" Solo 1 if ((iData & NUMBER_POW_FLAGS) == NUMBER_POW) iData |= NUMBER_POW_FINISH; else if (((iData & NUMBER_OF_OK) == NUMBER_OF_OK) || ((iData & PUNTO_DECIMAL) == PUNTO_DECIMAL) || ((iData & SIGNO_SRC) == SIGNO_SRC)) return 0; if ((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH) return 0; iData |= SIGNO_SRC; break; case 0x2C: if ( !((iData & NUMBER_OF_OK) == NUMBER_OF_OK) || ((iData & NUMBER_POW_FLAGS) == NUMBER_POW)) return 0; break; case 0x9: case 0xA: case 0xB: case 0xC: case 0xD: case 0x24: // Solo se permiten al inicio de un Numero (Espacios en Blanco). if (((iData & PUNTO_DECIMAL) == PUNTO_DECIMAL) || ((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH) || ((iData & NUMBER_OF_OK) == NUMBER_OF_OK) || ((iData & NUMBER_POW_FLAGS) == NUMBER_POW)) return 0; break; case 0xA0: case 0x20: // Se permiten al Inicio/final de un numero. if ((iData & NUMBER_OF_OK) == NUMBER_OF_OK) iData |= NUMBER_OF_FINISH; else if (((iData & PUNTO_DECIMAL) == PUNTO_DECIMAL) || ((iData & NUMBER_POW_FLAGS) == NUMBER_POW)) return 0; break; case 0x26: // Es un Numero Hexadecimal if (((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH) || ((iData & NUMBER_OF_OK) == NUMBER_OF_OK) || ((iData & SIGNO_SRC) == SIGNO_SRC) || ((iData & PUNTO_DECIMAL) == PUNTO_DECIMAL) || ((iData & NUMBER_POW_FLAGS) == NUMBER_POW)) return 0; pStr += iStep; if ((*pStr == 0x48) || (*pStr == 0x68)) { iData |= NUMBER_HEX; iData ^= 0xFF000000; i += iStep; } else { pStr -= iStep; } break; case 0x44: case 0x45: case 0x64: case 0x65: // Numeros en Formato ###e-###, ###e+### if (((iData & NUMBER_OF_FINISH) == NUMBER_OF_FINISH) || ((iData & NUMBER_POW) == NUMBER_POW)) return 0; if ((iData & NUMBER_OF_OK) == NUMBER_OF_OK) { iData |= NUMBER_POW; if ((iData & SIGNO_SRC) == SIGNO_SRC) iData ^= SIGNO_SRC; // Permitimos nuevamente los signos "+" y "-". } else { return 0; } break; default: return 0; break; } // switch() } // if() } // if() pStr += iStep; } // For() switch (iData & NUMBER_OF_FLAGS) { case NUMBER_OF_OK: case NUMBER_OF_FLAGS: return 1; break; default: switch (iData & NUMBER_HEX_FLAGS) { case NUMBER_HEX_FLAGS: return 1; break; } } return 0; }
main.h
Código
#ifndef __MAIN_H__ #define __MAIN_H__ #include <windows.h> #ifdef BUILD_DLL #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif DLL_EXPORT int __stdcall IsNumericA (char*); DLL_EXPORT int __stdcall IsNumericW (char*); int IsNumericEx (char *pStr, size_t uiLn, int iStep); #ifdef __cplusplus } #endif #endif // __MAIN_H__
Dulces Lunas!¡.