we have a requirement to make our serial numbers Base 36 (0-9,A-Z). My initial thought was store the counter in decimal and convert to hex only when required for display. This makes the counting simple, however there is another requirement to not use I or O because it'll be confused with 1 and 0 on the barcodes human readable portion. This makes it a bit of a nightmare.
Language is unimportant, but the counter itself will be held in SQL Server 2012+.
Anyone have any experiences with this problem?
Edit: I've rewritten a method I found to test in C#. It allows any string of base characters to be passed in. ie. string baseChars = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ"; It's not pretty but its a start!
    private string GetCustomBase(int iValue, string baseChars)
    {
        int baseNum = baseChars.Length;           
        int value= iValue;
        string result = "";
        while( value > 0 )
        {
            result = baseChars[ 0 + (value % baseNum)] + result;
            value = value / baseNum;
        }
        return result;
    }
    private int GetDecimal(string strValue, string baseChars)
    {
        int baseNum = baseChars.Length;
        string strAmendedValue = strValue;
        int iResult = 0;
        //Each char one at a time (from right)
        for (int i = 0; i < strValue.Length; i++)
        {
            string c = strValue.Substring(strValue.Length - i -1, 1);
            int iPos = baseChars.IndexOf(c);    //get actual value (0 = 0, A = 10 etc.)
            int iPowerVal = (int)Math.Pow((double)baseNum, (double)(i));
            iResult = iResult + (iPowerVal * iPos);
        }
        return iResult;
    }
				
                        
An implementation of the suggestion in the question comments. As language is unimportant, here's a Ruby version:
Output:
EDIT: made it so that
IandOare interpreted as1and0, in case someone does misread it.