org.unlaxer.jaddress.normalizer.RomanNormalizer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of japanese-address-parser Show documentation
Show all versions of japanese-address-parser Show documentation
a simplejapanese address parser
The newest version!
package org.unlaxer.jaddress.normalizer;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.unlaxer.Range;
import com.ibm.icu.text.Transliterator;
public class RomanNormalizer implements RomanNumber {
private int MIN_VALUE = 1;
private int MAX_VALUE = 39;
private Transliterator upper = Transliterator.getInstance("Any-NFKD;Fullwidth-Halfwidth;Any-Upper;");
private Transliterator lower = Transliterator.getInstance("Any-Lower;");
private Pattern romanPattern = Pattern.compile("(^|[^A-Z]?)(?[IVX]+)($|[^A-Z])");
private Map toIntMap;
private Map toRomanMap;
public RomanNormalizer() {
toIntMap = new LinkedHashMap<>();
toIntMap.put("IX", 9);
toIntMap.put("VIII", 8);
toIntMap.put("VII", 7);
toIntMap.put("VI", 6);
toIntMap.put("V", 5);
toIntMap.put("IV", 4);
toIntMap.put("III", 3);
toIntMap.put("II", 2);
toIntMap.put("I", 1);
toRomanMap = new LinkedHashMap<>();
toIntMap.forEach((k, v) -> {
toRomanMap.put(v, k);
});
}
@Override
public List searchRoman(String text) {
String value = upper.transliterate(text);
Matcher m = romanPattern.matcher(value);
List list = new ArrayList<>();
while (m.find()) {
String val = m.group("roma");
var ret = toNumber(val);
if (ret.isPresent()) {
list.add(new Range(m.start(), m.end()));
}
}
return list;
}
@Override
public Optional toNumber(String romanNumberString) {
String value = upper.transliterate(romanNumberString);
Matcher m = romanPattern.matcher(value);
if (!m.matches() || m.start() != 0 || m.end() != value.length())
return Optional.empty();
int ret = 0;
for (int i = 0; i < value.length(); i++) {
if (value.charAt(i) == 'X') {
ret += 10;
continue;
}
String val = value.substring(i);
if (!toIntMap.containsKey(val)) {
return Optional.empty();
}
ret += toIntMap.get(val);
return Optional.of(ret);
}
return Optional.empty();
}
@Override
public String toRomanNumberString(int number) {
if (number < MIN_VALUE || number > MAX_VALUE)
return null;
int x = number / 10;
int a = number % 10;
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= x; i++) {
sb.append("X");
}
sb.append(toRomanMap.get(a));
return sb.toString();
}
public String toLowRomanNumberString(int number) {
String ret = toRomanNumberString(number);
if (ret == null)
return null;
return lower.transliterate(ret);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy