Ejemplo n.º 1
0
        private boolean createFormattingTemplate(NumberFormat format)
        {
            String numberPattern = format.getPattern();

            // The formatter doesn't format numbers when numberPattern contains "|", e.g.
            // (20|3)\d{4}. In those cases we quickly return.
            if (numberPattern.indexOf('|') != -1)
            {
                return(false);
            }

            // Replace anything in the form of [..] with \d
            numberPattern = CHARACTER_CLASS_PATTERN.matcher(numberPattern).replaceAll("\\\\d");

            // Replace any standalone digit (not the one in d{}) with \d
            numberPattern = STANDALONE_DIGIT_PATTERN.matcher(numberPattern).replaceAll("\\\\d");
            formattingTemplate.setLength(0);
            String tempTemplate = getFormattingTemplate(numberPattern, format.getFormat());

            if (tempTemplate.length() > 0)
            {
                formattingTemplate.append(tempTemplate);
                return(true);
            }
            return(false);
        }
Ejemplo n.º 2
0
 /**
  * Clears the internal state of the formatter, so it can be reused.
  */
 public void clear()
 {
     currentOutput = "";
     accruedInput.setLength(0);
     accruedInputWithoutFormatting.setLength(0);
     formattingTemplate.setLength(0);
     lastMatchPosition        = 0;
     currentFormattingPattern = "";
     prefixBeforeNationalNumber.setLength(0);
     nationalPrefixExtracted = "";
     nationalNumber.setLength(0);
     ableToFormat                  = true;
     inputHasFormatting            = false;
     positionToRemember            = 0;
     originalPosition              = 0;
     isCompleteNumber              = false;
     isExpectingCountryCallingCode = false;
     possibleFormats.clear();
     shouldAddSpaceAfterNationalPrefix = false;
     if (!currentMetadata.equals(defaultMetadata))
     {
         currentMetadata = getMetadataForRegion(defaultCountry);
     }
 }
 private int normalizeCharClass(StringBuilder newPattern, int i) {
     StringBuilder charClass = new StringBuilder();
     StringBuilder eq = null;
     int lastCodePoint = -1;
     String result;
     i++;
     charClass.append("[");
     while(true) {
         int c = normalizedPattern.codePointAt(i);
         StringBuilder sequenceBuffer;
         if (c == ']' && lastCodePoint != '\\') {
             charClass.append((char)c);
             break;
         } else if (Character.getType(c) == Character.NON_SPACING_MARK) {
             sequenceBuffer = new StringBuilder();
             sequenceBuffer.appendCodePoint(lastCodePoint);
             while(Character.getType(c) == Character.NON_SPACING_MARK) {
                 sequenceBuffer.appendCodePoint(c);
                 i += Character.charCount(c);
                 if (i >= normalizedPattern.length())
                     break;
                 c = normalizedPattern.codePointAt(i);
             }
             String ea = produceEquivalentAlternation(
                                               sequenceBuffer.toString());
             charClass.setLength(charClass.length()-Character.charCount(lastCodePoint));
             if (eq == null)
                 eq = new StringBuilder();
             eq.append('|');
             eq.append(ea);
         } else {
             charClass.appendCodePoint(c);
             i++;
         }
         if (i == normalizedPattern.length())
             throw error(new String("Unclosed character class"));
         lastCodePoint = c;
     }
     if (eq != null) {
         result = new String("(?:"+charClass.toString()+eq.toString()+")");
     } else {
         result = charClass.toString();
     }
     newPattern.append(result);
     return i;
 }
 private void normalize() {
     boolean inCharClass = false;
     int lastCodePoint = -1;
     // Convert pattern into normalizedD form
     normalizedPattern = Normalizer.normalize(pattern, Normalizer.Form.NFD);
     patternLength = normalizedPattern.length();
     // Modify pattern to match canonical equivalences
     StringBuilder newPattern = new StringBuilder(patternLength);
     for(int i=0; i<patternLength; ) {
         int c = normalizedPattern.codePointAt(i);
         StringBuilder sequenceBuffer;
         if ((Character.getType(c) == Character.NON_SPACING_MARK)
             && (lastCodePoint != -1)) {
             sequenceBuffer = new StringBuilder();
             sequenceBuffer.appendCodePoint(lastCodePoint);
             sequenceBuffer.appendCodePoint(c);
             while(Character.getType(c) == Character.NON_SPACING_MARK) {
                 i += Character.charCount(c);
                 if (i >= patternLength)
                     break;
                 c = normalizedPattern.codePointAt(i);
                 sequenceBuffer.appendCodePoint(c);
             }
             String ea = produceEquivalentAlternation(
                                            sequenceBuffer.toString());
             newPattern.setLength(newPattern.length()-Character.charCount(lastCodePoint));
             newPattern.append("(?:").append(ea).append(")");
         } else if (c == '[' && lastCodePoint != '\\') {
             i = normalizeCharClass(newPattern, i);
         } else {
             newPattern.appendCodePoint(c);
         }
         lastCodePoint = c;
         i += Character.charCount(c);
     }
     normalizedPattern = newPattern.toString();
 }