如何正确打印 unicode 数学幂

How to correctly print unicode math powers

我想使用 unicode 字符格式化一个数的幂。 问题是我必须首先解析一个包含 ^ 符号及其旁边的幂的字符串

我明白,例如,如果我得到 x^2 来格式化它,我基本上应该 System.out.println("x\u00B2") 来打印 x²

如果我得到一个 2 位数的幂,比如 x^23 怎么办?

我有以下格式化 1 位幂的代码:

//0, 1, 2, 3, 4, 5, 6, 7, 8, 9
 char[] unicodePowers = {'\u2070','\u00B9','\u00B2','\u00B3','\u2074',
            '\u2075','\u2076','\u2077','\u2078','\u2079'};
 String[] resultPowers = {"^0","^1","^2","^3","^4","^5","^6","^7","^8","^9"};

 for(int i = 0; i < unicodePowers.length; i++){
     expression = expression.replace(resultPowers[i],String.valueOf(unicodePowers[i]));
 }

我对Unicode的格式化不是很熟悉所以不知道有没有更好的方法解决。

谢谢!

使用java.util.regex.Pattern, calling .matcher to produce a Matcher. That matcher can replace all your targeted powers by running our passed function.

private static final Pattern EXPONENT_PATTERN = Pattern.compile("\^(\d+)");
private static final String NORMAL_LETTERS = "0123456789";
private static final String SUPERSCRIPT_LETTERS =
    "\u2070\u00B9\u00B2\u00B3\u2074\u2075\u2076\u2077\u2078\u2079";

public static String styled(String s) {
    return EXPONENT_PATTERN.matcher(s).replaceAll(mr -> {
        char[] chs = mr.group(1).toCharArray();
        for (int i = 0; i < chs.length; ++i) {
            int j = NORMAL_LETTERS.indexOf(chs[i]);
            if (j != -1) {
                chs[i] = SUPERSCRIPT_LETTERS.charAt(j);
            }
        }
        return new String(chs);
    });
}

对于您也可以搜索的字母,https://unicode-table.com/en/blocks/phonetic-extensions/ 但是我不认为有很多上标数学运算符。