我想用unicode字符格式化一个提升到电源的数字。问题是,我必须首先解析一个包含^符号的字符串及其旁边的权力。
我知道,例如,如果我让x^2格式化,我基本上应该用System.out.println("x\u00B2")来打印x 2。
如果我得到像x^23这样的2位幂呢?
我有以下代码来格式化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的格式化,所以我不知道是否有更好的方法来解决它。
谢谢!
发布于 2022-04-21 22:48:44
使用java.util.regex.Pattern,调用.matcher生成Matcher。这个匹配器可以通过运行我们通过的替换所有 函数来实现你的目标能力。
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/,但我不认为有很多上标数学运算符。
https://stackoverflow.com/questions/71961495
复制相似问题