protected ParseResult parsePercentage()

in Java/libraries/recognizers-text-number/src/main/java/com/microsoft/recognizers/text/number/parsers/BaseCJKNumberParser.java [137:273]


    protected ParseResult parsePercentage(ExtractResult extResult) {
        ParseResult result = new ParseResult(extResult.getStart(), extResult.getLength(), extResult.getText(), extResult.getType(), null, null, null);
        Map<Character, Double> zeroToNineMap = cjkConfig.getZeroToNineMap();

        String resultText = extResult.getText();
        long power = 1;

        if (extResult.getData().toString().contains("Spe")) {
            resultText = normalizeCharWidth(resultText);
            resultText = replaceUnit(resultText);

            if (resultText.equals("半額") || resultText.equals("半値") || resultText.equals("半折")) {
                result.setValue(50);
            } else if (resultText.equals("10成") || resultText.equals("10割") || resultText.equals("十割")) {
                result.setValue(100);
            } else {
                Match[] matches = RegExpUtility.getMatches(this.cjkConfig.getSpeGetNumberRegex(), resultText);
                double intNumber;

                if (matches.length == 2) {
                    char intNumberChar = matches[0].value.charAt(0);

                    if (intNumberChar == cjkConfig.getPairChar()) {
                        intNumber = 5;
                    } else if (cjkConfig.getTenChars().contains(intNumberChar)) {
                        intNumber = 10;
                    } else {
                        intNumber = zeroToNineMap.get(intNumberChar);
                    }

                    char pointNumberChar = matches[1].value.charAt(0);
                    double pointNumber;
                    if (pointNumberChar == '半') {
                        pointNumber = 0.5;
                    } else {
                        pointNumber = zeroToNineMap.get(pointNumberChar) * 0.1;
                    }

                    result.setValue((intNumber + pointNumber) * 10);
                } else if (matches.length == 5) {
                    // Deal the Japanese percentage case like "xxx割xxx分xxx厘", get the integer value and convert into result.
                    char intNumberChar = matches[0].value.charAt(0);
                    char pointNumberChar = matches[1].value.charAt(0);
                    char dotNumberChar = matches[3].value.charAt(0);

                    double pointNumber = zeroToNineMap.get(pointNumberChar) * 0.1;
                    double dotNumber = zeroToNineMap.get(dotNumberChar) * 0.01;

                    intNumber = zeroToNineMap.get(intNumberChar);

                    result.setValue((intNumber + pointNumber + dotNumber) * 10);
                } else {
                    char intNumberChar = matches[0].value.charAt(0);

                    if (intNumberChar == cjkConfig.getPairChar()) {
                        intNumber = 5;
                    } else if (cjkConfig.getTenChars().contains(intNumberChar)) {
                        intNumber = 10;
                    } else {
                        intNumber = zeroToNineMap.get(intNumberChar);
                    }

                    result.setValue(intNumber * 10);
                }
            }
        } else if (extResult.getData().toString().contains("Num")) {

            Match[] doubleMatches = RegExpUtility.getMatches(cjkConfig.getPercentageRegex(), resultText);
            String doubleText = doubleMatches[doubleMatches.length - 1].value;

            if (doubleText.contains("k") || doubleText.contains("K") || doubleText.contains("k") ||
                doubleText.contains("K")) {
                power = 1000;
            }

            if (doubleText.contains("M") || doubleText.contains("M")) {
                power = 1000000;
            }

            if (doubleText.contains("G") || doubleText.contains("G")) {
                power = 1000000000;
            }

            if (doubleText.contains("T") || doubleText.contains("T")) {
                power = 1000000000000L;
            }

            result.setValue(getDigitValue(resultText, power));
        } else {
            Match[] doubleMatches = RegExpUtility.getMatches(cjkConfig.getPercentageRegex(), resultText);
            String doubleText = doubleMatches[doubleMatches.length - 1].value;

            doubleText = replaceUnit(doubleText);

            String[] splitResult = cjkConfig.getPointRegex().split(doubleText);
            if (splitResult[0].equals("")) {
                splitResult[0] = String.valueOf(cjkConfig.getZeroChar());
            }

            double doubleValue = getIntValue(splitResult[0]);
            if (splitResult.length == 2) {
                if (cjkConfig.getNegativeNumberSignRegex().matcher(splitResult[0]).find()) {
                    doubleValue -= getPointValue(splitResult[1]);
                } else {
                    doubleValue += getPointValue(splitResult[1]);
                }
            }

            result.setValue(doubleValue);
        }

        Match[] matches = RegExpUtility.getMatches(this.cjkConfig.getPercentageNumRegex(), resultText);
        if (matches.length > 0) {
            String demoString = matches[0].value;
            String[] splitResult = cjkConfig.getFracSplitRegex().split(demoString);
            String demoPart = splitResult[0];

            Pattern digitNumRegex = cjkConfig.getDigitNumRegex();

            double demoValue = digitNumRegex.matcher(demoPart).find() ?
                    getDigitValue(demoPart, 1.0) :
                    getIntValue(demoPart);
            if (demoValue < 100) {
                result.setValue((double)result.getValue() * (100 / demoValue));
            } else {
                result.setValue((double)result.getValue() / (demoValue / 100));
            }
        }

        if (result.getValue() instanceof Double) {
            result.setResolutionStr(getResolutionString((double)result.getValue()) + "%");
        } else if (result.getValue() instanceof Integer) {
            result.setResolutionStr(getResolutionString((int)result.getValue()) + "%");
        }

        return result;
    }