All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.unlaxer.jaddress.normalizer.RomanNormalizer Maven / Gradle / Ivy

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