diff --git a/src/main/java/org/betterx/bclib/util/RomanNumeral.java b/src/main/java/org/betterx/bclib/util/RomanNumeral.java
new file mode 100644
index 00000000..819ffbd9
--- /dev/null
+++ b/src/main/java/org/betterx/bclib/util/RomanNumeral.java
@@ -0,0 +1,45 @@
+package org.betterx.bclib.util;
+
+import java.util.TreeMap;
+
+/**
+ * base on ...
+ */
+
+public class RomanNumeral {
+ private final static TreeMap LITERALS = new TreeMap<>();
+
+ private static void lazyInit() {
+ if (LITERALS.isEmpty()) {
+ LITERALS.put(1000, "M");
+ LITERALS.put(900, "CM");
+ LITERALS.put(500, "D");
+ LITERALS.put(400, "CD");
+ LITERALS.put(100, "C");
+ LITERALS.put(90, "XC");
+ LITERALS.put(50, "L");
+ LITERALS.put(40, "XL");
+ LITERALS.put(10, "X");
+ LITERALS.put(9, "IX");
+ LITERALS.put(5, "V");
+ LITERALS.put(4, "IV");
+ LITERALS.put(1, "I");
+ }
+ }
+
+ public static String toRoman(int number) {
+ lazyInit();
+ return _toRoman(number);
+ }
+
+ private static String _toRoman(int number) {
+ //there is no 0 in roman, but we need it anyway ;)
+ if (number == 0) return "0";
+
+ int l = LITERALS.floorKey(number);
+ if (number == l) {
+ return LITERALS.get(number);
+ }
+ return LITERALS.get(l) + _toRoman(number - l);
+ }
+}