internal void ConsumeSubString(DTSubString sub) {
     Contract.Assert(sub.index == Index, "sub.index == Index");
     Contract.Assert(sub.index + sub.length <= len, "sub.index + sub.length <= len");
     Index = sub.index + sub.length;
     if (Index < len) {
         m_current = Value[Index];
     }
 }
        internal DTSubString GetSubString() {
            DTSubString sub = new DTSubString();
            sub.index = Index;
            sub.s = Value;
            while (Index + sub.length < len) {
                DTSubStringType currentType;
                Char ch = Value[Index + sub.length];
                if (ch >= '0' && ch <= '9') {
                    currentType = DTSubStringType.Number;
                }
                else {
                    currentType = DTSubStringType.Other;
                }

                if (sub.length == 0) {
                    sub.type = currentType;
                }
                else {
                    if (sub.type != currentType) {
                        break;
                    }
                }
                sub.length++;
                if (currentType == DTSubStringType.Number) {
                    // Incorporate the number into the value
                    // Limit the digits to prevent overflow
                    if (sub.length > DateTimeParse.MaxDateTimeNumberDigits) {
                        sub.type = DTSubStringType.Invalid;
                        return sub;
                    }
                    int number = ch - '0';
                    Contract.Assert(number >= 0 && number <= 9, "number >= 0 && number <= 9");
                    sub.value = sub.value * 10 + number;
                }
                else {
                    // For non numbers, just return this length 1 token. This should be expanded
                    // to more types of thing if this parsing approach is used for things other
                    // than numbers and single characters
                    break;
                }
            }
            if (sub.length == 0) {
                sub.type = DTSubStringType.End;
                return sub;
            }

            return sub;
        }