解析unicode' Vulgar Fractions'在Java中加倍

时间:2014-09-24 21:09:52

标签: java regex unicode double

我正在抓取网站的一些数据,其中一部分包括unicode中的分数,例如6'5¼“。我已成功使用正则表达式(\\d)' (\\d{1,2}([\\xbc-\\xbe])?)\"来提取字符串的每个部分。

这给了我两个字符串,一个是"6",另一个是"5¼"

麻烦的部分是包含unicode粗俗部分的位。显然,使用Double.parseDouble无法正确解析。

我到处寻找Java的例子,但一直找不到,我怎么会把¼输出为0.25?

如果它变得更容易我可以再次分割正则表达式,所以它单独返回分数部分所以我得到三个字符串而不是两个。

2 个答案:

答案 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; }
}