             
             // There may not be any digits after the decimal
             // if domain is int.
-            if ((i < len) && (DECIMAL_DIGITS.indexOf(input.charAt(i)) != -1))
+            var c0:int = input.charCodeAt(i);
+            var c32:int = processSurrogates(input, c0, i, len);
+            if (c32 == -1)
+            {
+                results.push(new ValidationResult(
+                    true, baseField, "invalidChar", invalidCharError));
+                return false;
+            }
+
+            if ((i < len) && isDigit(c32))
             {
                 if (domain == NumberValidatorDomainType.INT)
                 {

            }
        }

        if ((decimalSeparator == groupingSeparator) ||
            (negativeSymbol == groupingSeparator) ||
            (decimalSeparator == negativeSymbol))
        {
            results.push(new ValidationResult(
               true, baseField, "invalidFormatChars", invalidFormatCharsError));
            return false;
        }
        // handle "-." special case
        else if (input == (negativeSymbol + decimalSeparator))
        {
            results.push(new ValidationResult(
                true, baseField, "invalidChar", invalidCharError));
            return false;
        }
        // handle "(.)" special case
        else if (input == ("(" + decimalSeparator + ")"))
        {
            results.push(new ValidationResult(
                true, baseField, "invalidChar", invalidCharError));
            return false;
        }
        else if (input.indexOf(negativeSymbol) !=
                 input.lastIndexOf(negativeSymbol))
        {

            results.push(new ValidationResult(
                    true, baseField, "negativeSymbol", negativeSymbolError));
            return false;

     */
    mx_internal function validateDecimalString(input:String,
                                               baseField:String,
                                               results:Array, 
                                               negPosLeft:Boolean):Boolean
    {
        if (!input)
            return true;
        
        var dindex:int;
        if (negPosLeft)
            dindex = input.lastIndexOf(decimalSeparator);
        else
            dindex = input.indexOf(decimalSeparator);
        var c:String;
        var i:int;
        var c0:int;
        var c1:int;
        if (dindex == -1)
            return true;
        
        for (i = input.length; i > dindex; i--)
        {
            c0 = input.charCodeAt(i);
            c1 = processSurrogates(input, c0, i, eindex);
            if (c1 == -1)
                return false; //illegal surrogate
            if (isDigit(c1))
                break;
            if (c0 != c1)
                    i--; // digit was surrogate. increment string index.
        }
        var eindex:int = i;
        i = dindex + decimalSeparator.length;
        
        for (; i < eindex; i++)
        {
            c0 = input.charCodeAt(i);
            c1 = processSurrogates(input, c0, i, eindex);
                
            if ((c1 != -1) && isDigit(c1))
            {
                if (c0 != c1)
                    i++; // digit was surrogate. increment string index.
                continue;
            }
            else
