我正在抓取网站的一些数据,其中一部分包括unicode中的分数,例如6'5¼“。我已成功使用正则表达式(\\d)' (\\d{1,2}([\\xbc-\\xbe])?)\"
来提取字符串的每个部分。
这给了我两个字符串,一个是"6"
,另一个是"5¼"
。
麻烦的部分是包含unicode粗俗部分的位。显然,使用Double.parseDouble
无法正确解析。
我到处寻找Java的例子,但一直找不到,我怎么会把¼输出为0.25?
如果它变得更容易我可以再次分割正则表达式,所以它单独返回分数部分所以我得到三个字符串而不是两个。
答案 0 :(得分:7)
有一种方法可以在没有自己的粗俗分数表的情况下执行此操作,您可以使用Unicode数据中内置的表。
如果转换为Unicode标准化表单KD,它会将分数分解为由普通数字包围的分数斜杠(U + 2044)。所以你可以这样做:
String[] fraction = Normalizer.normalize("¼", Normalizer.Form.NFKD).split("\u2044");
if (fraction.length == 2) {
double value = (double) Integer.parseInt(fraction[0]) / Integer.parseInt(fraction[1]);
}
比U + 00BC-U + 00BE范围内的分数字符更多,例如⅛,所以如果你想避免对该范围进行硬编码,我建议将它的正则表达式更改为{ {1}}。
答案 1 :(得分:2)
[我...]宁愿没有在
中硬编码的值
您是否期望¼的含义发生变化?我会使用枚举“硬编码”这些值:
enum VulgarFraction {
...,
ONE_QUARTER('¼', 0.25),
ONE_HALF('½', 0.5),
...
;
private final char codepoint;
private final double value;
VulgarFraction(char codepoint, double value) {
this.codepoint = codepoint;
this.value = value;
}
char getCodepoint() { return codepoint; }
double getValue() { return value; }
}