如何正确打印 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/
但是我不认为有很多上标数学运算符。
我想使用 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/ 但是我不认为有很多上标数学运算符。