× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



If it's credit card check digit processing you want, here's what we use:

 *//////////////////////////////////////////////////////////////*
 * (CheckCC) Validate Credit Card Number                        *
 *//////////////////////////////////////////////////////////////*
PCheckCC          B                                              
 *--------------------------------------------------------------*
DCheckCC          PI             1A                              
D CCnumber                      25A   value                      
D CCType                         2A   value                      
                                                                 
DWorkCCnum        S             25A                              
DPos              S              2S 0                            
DLen              S              2S 0                            
DValidCC          S              1A                              
DValidPrefix      S              1A                              
DValidLength      S              1A                              
DCCLength         S              2S 0 dim(2)                     
DCCPrefix         S              4A   dim(8)                     
DPrefixCtr        S              2S 0                            
DPrefixLen        S              2S 0                            
                                                                 
DTestDigDS        DS                                             
D TestDigit               1      1A                              
D TestDigitN              1      1S 0                            
                                                                 
C                   eval      ValidCC='N'                  
C                   movea     *zeros        CCLength       
C                   movea     *blanks       CCPrefix       
                                                           
 * Determine card type. If this is a PO, don't validate it.
C                   If        CCType='po'                  
C                   eval      ValidCC='Y'                  
C                   eval      ValidPrefix='N'              
C                   eval      ValidLength='N'              
C                   Else                                   
C                   Select                                 
C                   When      CCType='vs'                  
C                   eval      CCLength(1)=13               
C                   eval      CCLength(2)=16               
C                   eval      CCPrefix(1)='4'              
C                   eval      PrefixCtr=1                  
C                   When      CCType='mc'                  
C                   eval      CCLength(1)=16               
C                   eval      CCPrefix(1)='51'             
C                   eval      CCPrefix(2)='52'             
C                   eval      CCPrefix(3)='53'             
C                   eval      CCPrefix(4)='54'             
C                   eval      CCPrefix(5)='55'             
C                   eval      PrefixCtr=5                  
C                   When      CCType='am'                          
C                   eval      CCLength(1)=15                       
C                   eval      CCPrefix(1)='34'                     
C                   eval      CCPrefix(2)='37'                     
C                   eval      PrefixCtr=2                          
C                   When      CCType='dc'                          
C                   eval      CCLength(1)=16                       
C                   eval      CCPrefix(1)='6011'                   
C                   eval      PrefixCtr=1                          
C                   EndSl                                          
                                                                   
 * Strip out non-numbers                                           
C                   eval      Pos=0                                
C                   eval      WorkCCNum=''                         
                                                                   
C                   DoW       Pos < %len(%trim(CCNumber))          
C                   eval      Pos=Pos+1                            
C                   eval      TestDigit=%subst(CCNumber:Pos:1)     
                                                                   
C                   If        (TestDigit>='0') AND (TestDigit<='9')
C                   eval      WorkCCNum=%trim(WorkCCNum)+TestDigit 
C                   EndIf                                          
                                                                   
C                   EndDo                                          
                                                                     
 * Verify number lengths                                             
C                   If        (%len(%trim(WorkCCNum))=CCLength(1)) OR
C                             (%len(%trim(WorkCCNum))=CCLength(2))   
C                   eval      ValidPrefix='Y'                        
C                   EndIf                                            
 * Verify card prefixes                                              
C                   eval      Pos=0                                  
C                   DoW       Pos < PrefixCtr                        
C                   eval      Pos=Pos+1                              
C                   eval      PrefixLen=%len(%trim(CCPrefix(Pos)))   
C                   If        %subst(WorkCCNum:1:PrefixLen)=         
C                             %trim(CCPrefix(Pos))                   
C                   eval      ValidLength='Y'                        
C                   EndIf                                            
C                   EndDo                                            
                                                                     
 * Verify check digit                                                
C                   eval      Pos=0                                  
C                   eval      Len=%len(%trim(WorkCCNum))             
C                   z-add     *zeros        sum              10 0    
C                   z-add     *zeros        qsum             10 0    
C                   DoW       Pos < Len                              
C                   eval      Pos=Pos+1                              
C                   eval      TestDigit=%subst(WorkCCNum:Len-Pos+1:1)
C                   If        #mod(Pos:2) = 0                        
C                   eval      sum=2 * TestDigitN                     
C                   eval      qsum=qsum + #mod(sum:10)               
C                   If        sum>9                                  
C                   eval      qsum=qsum+1                            
C                   EndIf                                            
C                   Else                                             
C                   eval      qsum=qsum+TestDigitN                   
C                   EndIf                                            
C                   EndDo                                            
                                                                     
C                   If        (#mod(qsum:10) = 0)                    
C                             AND (ValidLength = 'Y')                
C                             AND (ValidPrefix='Y')                  
C                   eval      ValidCC='Y'                            
C                   EndIf                                            
                                                                     
C                   EndIf                                            
                                                                     
C                   return    ValidCC                                
PCheckCC          E                                                  

I basically ported over an ASP example of this several years ago and we haven't 
had any problems with it. The type is the card type (vs=Visa, mc=MasterCard, 
am=American Express, dc=Discover) except for type=po, we use that to say 
Purchase Order which obviously doesn't need to go through this routine. The 
example I found had a few other card types defined but I don't have the URL to 
it anymore. A search on Google should turn up plenty of examples for the major 
cards.

Matt

-----Original Message-----
From: Bob Cozzi [mailto:cozzi@xxxxxxxxx]
Sent: Wednesday, February 25, 2004 10:34 AM
To: 'RPG programming on the AS400 / iSeries'
Subject: RE: Modulus 10 formula (REPOST)


Crap! That's what I thought.  :(
-Bob


-----Original Message-----
From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-bounces@xxxxxxxxxxxx]
On Behalf Of Barr, Regan
Sent: Wednesday, February 25, 2004 9:26 AM
To: RPG400-L
Subject: RE: Modulus 10 formula (REPOST)

Bob,

I'm just finishing up a credit card project, and I found that there seem to
be as many versions of the
Mod10 as there are merchants/card issuers.  I was working primarily with
validating merchant numbers.
<snip>


As an Amazon Associate we earn from qualifying purchases.

This thread ...


Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.