for a nice speed increase (no strlen and only one pointer dereference) try changing
for (i = 0; i < strlen (z); i++) { to const char *iter; char ch; for(iter=z; (ch=*iter); ++iter) { and if (i == 0) { to if(iter==z) { and all the z[i] to ch. On 5/15/05, Michael Evenson <[EMAIL PROTECTED]> wrote: > This fixes the problem of negative numeric values. It does not however > handle locale specific numbers (like using , as decimal separator) or for > that matter, commas in the numbers. As I understand it, sqlite does not > handle locale specific numbers in general. > > Mike > > > /* > ** Implementation of the isnumeric() function > */ > static void isnumericFunc(sqlite3_context *context, int argc, sqlite3_value > **argv) > { > int i; > int nResult = 1; > > assert( argc==1 ); > switch( sqlite3_value_type(argv[0]) ){ > case SQLITE_INTEGER: { > sqlite3_result_int(context, 1); > break; > } > case SQLITE_FLOAT: { > sqlite3_result_int(context, 1); > break; > } > case SQLITE_NULL: { > sqlite3_result_int(context, 0); > break; > } > case SQLITE_TEXT: { > int d = 0; > const char *z = sqlite3_value_text(argv[0]); > for (i = 0; i < strlen (z); i++) { > if (!isdigit (z[i])) { > /* the character is not a digit */ > if (i == 0) { > /* allow - or + as the first character */ > if ((z[i] != '-') && (z[i] != '+') && (z[i] != '.')) { > /* only +, - and . allowed as first non digit character */ > nResult = 0; > if (z[i] == '.') > d++; > break; > } > } > else { > if ((d > 0) && (z[i] == '.')) { > /* only . allowed as non digit character here */ > /* and only one of them in the string */ > nResult = 0; > break; > } > else if (z[i] == '.') > d++; > } > } > } > sqlite3_result_int(context, nResult); > break; > } > default: { > sqlite3_result_int(context, 0); > break; > } > } > } > > > -----Original Message----- > > From: Wolfgang Rohdewald [mailto:[EMAIL PROTECTED] > > Sent: Saturday, May 14, 2005 8:39 AM > > To: sqlite-users@sqlite.org > > Subject: Re: [sqlite] Convert and isnumeric function > > > > On Samstag 14 Mai 2005 00:31, Michael Evenson wrote: > > > case SQLITE_TEXT: { > > > const char *z = sqlite3_value_text(argv[0]); > > > for (i = 0; i < strlen (z); i++) { > > > if (!isdigit (z[i])) { > > > nResult = 0; > > > break; > > > } > > > > this should return FALSE for -5, 1123.456. > > In some locales, that might be written as 1'123,456 or > > 1,123.456 or whatever. > > > > strtol() > > > > seems to what you need, see man strol() > > > > -- > > Wolfgang > > > > -- Cory Nelson http://www.int64.org