package choonster.testmod3.util; import java.util.function.IntFunction; public class StringUtils { /** * Builds a String by applying the specified Function to each digit of the number. * * @param function The function to call for each digit * @param minus The String to prefix negative numbers with * @param number The number * @return The built String */ private static String buildDigitString(IntFunction<char[]> function, String minus, int number) { // 0 requires a special case if (number == 0) return new String(function.apply(0)); final boolean isNegative = number < 0; number = Math.abs(number); final StringBuilder builder = new StringBuilder(); // Get each digit of the number // Based on this StackOverflow answer from Martin B: http://stackoverflow.com/a/3118505 while (number > 0) { builder.append(function.apply(number % 10)); number /= 10; } if (isNegative) { builder.append(minus); } return builder.reverse().toString(); } /** * Gets the Unicode subscript character (U+2080 - U+2089) for the specified digit. * * @param digit The digit (must be in range 0-9) * @return A char array representing the subscript character */ private static char[] subscriptForDigit(int digit) { return Character.toChars(0x2080 + digit); } /** * Gets a subscript String from the specified number using Unicode subscript characters (U+2080 - U+2089, U+208B). * * @param number The number * @return The subscript String */ public static String subscript(int number) { return buildDigitString(StringUtils::subscriptForDigit, "₋", number); } private static final char[] SUPERSCRIPT_1 = "¹".toCharArray(), SUPERSCRIPT_2 = "²".toCharArray(), SUPERSCRIPT_3 = "³".toCharArray(); /** * Gets the superscript character (U+00B9, U+00B2, U+00B3, U+2070, U+2074 - U+2079) for the specified digit. * * @param digit The digit (must be in range 0-9) * @return A char array representing the superscript character */ private static char[] superscriptForDigit(int digit) { // Superscript 1, 2 and 3 require a special case since they're outside the U+207x range switch (digit) { case 1: return SUPERSCRIPT_1; case 2: return SUPERSCRIPT_2; case 3: return SUPERSCRIPT_3; default: return Character.toChars(0x2070 + digit); } } /** * Gets a superscript String from the specified number using Unicode superscript characters (U+00B9, U+00B2, U+00B3, U+2070, U+2074 - U+2079, U+207B). * * @param number The number * @return The subscript String */ public static String superscript(int number) { return buildDigitString(StringUtils::superscriptForDigit, "⁻", number); } }