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
> 


Reply via email to