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;
}