Alpha Video Training
Results 1 to 9 of 9

Thread: String validation

  1. #1
    "Certified" Alphaholic
    Real Name
    Tom Cone Jr
    Join Date
    Apr 2000
    Location
    Florida
    Posts
    23,311

    Default String validation

    I need to validate a string of characters entered in a 'get_text' dialog box. The purpose is to verify that each character falls in the range a..z, or A..Z, or is a space, or is a hyphen. All other characters, including punctuation and control key combinations would be consider 'invalid'.

    Have identified two possible approaches:

    a) cycle through the characters in the string one at a time, comparing their ascii characters to permitted 'ranges' of ascii values; or

    b) cycle through the characters in the string one at a time, and for each use *ANY to see if each is found within a longer string of permitted characters.

    Question1: which approach is apt to be faster?

    Question2: Is there a better way ?

    Thanks.

    -- tom

  2. #2
    "Certified" Alphaholic Stan Mathews's Avatar
    Real Name
    Stan Mathews
    Join Date
    Apr 2000
    Location
    Bowling Green, KY
    Posts
    25,119

    Default RE: String validation

    Oh what tangled webs we weave....

    As an alternative solution, with no idea as to speed, you could count the number of hyphens and spaces

    counthy=0
    countsp=0
    for i = 1 to len(yourtextinput)
    if at("-",yourtextinput,i)
    counthy=counthy+1
    else if at(" ",yourtextinput,i)
    countsp=countsp+1
    end if
    next

    then remspecial yourtextinput, test the length as compared to the original length plus the number of hyphens plus the number of spaces.

    If you are dealing with relatively short character strings, I think your ascii test might be best. For longer strings?

    Good luck.

    Stan

  3. #3
    "Certified" Alphaholic Stan Mathews's Avatar
    Real Name
    Stan Mathews
    Join Date
    Apr 2000
    Location
    Bowling Green, KY
    Posts
    25,119

    Default RE: String validation

    Didn't quite get that right.

    Should be

    if at("-",yourtextinput,i) >0

    and

    else if at(" ",yourtextinput,i)> 0

  4. #4
    "Certified" Alphaholic
    Real Name
    Peter Wayne
    Join Date
    Apr 2000
    Posts
    1,728

    Default RE: String validation

    for question 2:
    try the chrtran() function.


    dim valid as l
    dim valid_chr as c
    dim input as c

    valid_chr="abcdefghijklmnopqrstuvwxyz- "

    input=ui_get_text("Enter","Something")
    if chrtran(lower(input),valid_chr,space(28))=space(len(input)) then
    valid=.t.
    else
    valid=.f.
    end if

  5. #5
    VAR csda1's Avatar
    Real Name
    Ira J Perlow
    Join Date
    Apr 2000
    Location
    Boston, Massachusetts, USA
    Posts
    3,530

    Default RE: String validation

    Hi Tom,

    The answer depends upon the length of the input string.
    For the test, I'll assume you'll uppercase the text string (saves extra compares)

    If the typical length is less than 28, I would search for each character in a permissible string, as in

    char $ "ABCDEFGHIJKLMNOPQRSTUVWXYZ -"

    If greater than 28 or so, then you need to check each character A thru Z and eliminate them from the string until the string is left with all remaining characters.

    It may be possible to skip the cycling of characters and do it all in 1 line by something like

    LogicalValue = CONTAINSI("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z -",TRANSFORM(inputstring,"@!R"+REPLICATE(" X",len(inputstring))))
    .and..not.("," $ inputstring).and..not.(";" $ inputstring)

    You just have to keep adding .and..not.("x" $ inputstring) to include all special characters that are percieved as word separators by CONTAINSI. I have not totally tested this method, but seems to work basically.

    Regards,

    Ira J. Perlow
    Computer Systems Design & Associates
    csda@mediaone.net

  6. #6
    VAR csda1's Avatar
    Real Name
    Ira J Perlow
    Join Date
    Apr 2000
    Location
    Boston, Massachusetts, USA
    Posts
    3,530

    Default RE: String validation

    Peter,

    Unless chrtran() definition is wrong, your methos won't work, as it is checking for the same characters as the validation string (thus "abcdefghihjkklmnopqrstuvwxyz- " is the only one that will pass.

    I will have to see if the documentation matches reality. If it does what a function like chrtran() would be expected to do, then your method would work.

    Regards,

    Ira J. Perlow
    Computer Systems Design & Associates
    csda@mediaone.net

  7. #7
    VAR csda1's Avatar
    Real Name
    Ira J Perlow
    Join Date
    Apr 2000
    Location
    Boston, Massachusetts, USA
    Posts
    3,530

    Default RE: String validation

    Hi Peter,

    I checked this morning and apparently chrtran() does work as one would expect it to work, not as the documentation indicates. I always thought it should work that way, but boy is the documentation wrong!

    To make your code a bit faster and more generic, I would change it as follows;


    dim valid as l
    dim valid_chr as c
    dim input as c


    input=ui_get_text("Enter","Something")

    valid_chr="abcdefghijklmnopqrstuvwxyz- "
    valid=if(trim(chrtran(lower(input),valid_chr,len(valid_chr)))=="",.t.,.f.)


    Regards,

    Ira J. Perlow
    Computer Systems Design & Associates
    csda@mediaone.net

  8. #8
    VAR csda1's Avatar
    Real Name
    Ira J Perlow
    Join Date
    Apr 2000
    Location
    Boston, Massachusetts, USA
    Posts
    3,530

    Default RE: String validation

    Tom and Peter,

    Here's a final generic function


    function IsAlphabetic as L(Text as C)
    'Alpha 5 Version 5 with optional ValidChr and Flags strings
    'function IsAlphabetic as L(Text as C,ValidChr="",Flags="I")

    ' Created by Computer Systems Design & Associates
    ' Copyright 2001 Computer Systems Design & Associates, All Rights Reserved
    ' Create Date: July 21, 2001
    ' Last Update: July 21, 2001

    ' Purpose:This function checks if allowed alphabetic
    ' (or any valid character string in version 5)
    ' characters are in the the input text string

    ' Input Parameters:
    ' Text - Input text string to check
    ' ValidChr - Text string of allowable characters
    ' Flags - "I" if case insensitive, null or blank if not

    ' Output (Return Value):
    ' Returns true if only allowable characters are in the text string

    ' Errors:

    ' Examples:
    ' IsAlphabetic("ABC @def")
    ' IsAlphabetic("ABC @def","ABCDEFGHIJKLMNOPQRSTUVWXYZ @") ' Version 5
    ' IsAlphabetic("ABC @def","ABCDEFGHIJKLMNOPQRSTUVWXYZ @","I") ' Version 5

    ' Notes:

    ' Set initial return in case of an error
    IsAlphabetic=.F.

    ' Initialize optional parameters in case we are not using version 5 or greater
    dim ValidChr as c
    dim Flags as C

    ' Set Flags here to case insensitive for Version 4 and less
    Flags=""

    ' If ValidChr is blank, then set default allowable characters
    If ValidChr==""
    ValChr="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    Else
    ValChr=ValidChr
    End If

    ' Set translation string
    TrnChr=space(len(ValChr))

    ' If a space is not an allowable character,
    ' translate it to a tilde for the check
    If .not.(" " $ ValChr)
    TrnChr=TrnChr+"~"
    ValChr=ValChr+" "
    End If

    'trace.writeln("TrnChr="+TrnChr)
    'trace.writeln("ValChr="+ValChr)

    ' If "i" or "I" is in flags, then do a case insensitive check
    IF "I" $ UPPER(Flags)
    IsAlphabetic=if(trim(chrtran(UPPER(text),ValChr,TrnChr))=="",.T.,.F.)
    ELSE
    IsAlphabetic=if(trim(chrtran(text,ValChr,TrnChr))=="",.T.,.F.)
    END IF

    end function


    Regards,

    Ira J. Perlow
    Computer Systems Design & Associates
    csda@mediaone.net


  9. #9
    "Certified" Alphaholic
    Real Name
    Tom Cone Jr
    Join Date
    Apr 2000
    Location
    Florida
    Posts
    23,311

    Default RE: String validation

    Thanks to everyone for the ideas, the scripts, and especially the generic function.

    Here's another approach, which seems to work instantaneously:

    statusbar.clear()
    statusbar.set_text("Validating entry, standby...")
    isok = .t.
    counter = len(inputstring)
    for loopcount = 1 to counter
    tv = asc(substr(insputstring,loopcount,1)) 'get ascii value of single char
    select
    case tv >= 65 .and. tv = 97 .and. tv

Similar Threads

  1. String issue
    By tarlachmoorhouse in forum Alpha Five Version 5
    Replies: 3
    Last Post: 03-18-2004, 01:03 PM
  2. Validation of more than 1
    By Wexler in forum Alpha Five Version 5
    Replies: 4
    Last Post: 03-01-2004, 04:23 AM
  3. Stripping a string except...
    By Louis Nickerson in forum Alpha Five Version 5
    Replies: 12
    Last Post: 08-13-2003, 07:16 AM
  4. Picking Apart A String
    By Louis Nickerson in forum Alpha Five Version 5
    Replies: 8
    Last Post: 08-09-2003, 05:19 PM
  5. String Advice
    By scottly in forum Alpha Five Version 5
    Replies: 4
    Last Post: 06-17-2003, 01:50 PM

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •