Java中的十进制数到utf-8有理数

时间:2014-09-15 11:30:50

标签: java double rational-number

我想改变2.5到2½。不知道如何改变它。

假设我在长文本中有“AMZN2½22”,我必须在java swing textpane中突出显示,但我在三个变量中有值,如下所示

A = AMZN
B = 2.5
C = 22

基于这个值,我将无法匹配如此将B更改为Rational数字(String)然后匹配并且它工作正常但我不想这样做......它只是一个临时修复。

有人可以帮助我吗?

B = B.toString().replace(".25", "¼")
                        .replace(".5", "½") 
                        .replace(".75", "¾")
                        .replace(".375", "⅜")
                        .replace(".625", "⅜")
                        .replace(".125", "⅛")
                        .replace(".875", "⅞")
                        .replace(".0", "")
                        .replace(".000", "")
                        .replace(".00", "");

由于

3 个答案:

答案 0 :(得分:0)

以下是打印符号'half'的方法:

String half = "\u20BD";

System.out.println("2" + half);

确定一个数字是一个整数加一半是留给读者的练习。

答案 1 :(得分:0)

你可以交换.0替换正则表达式(replaceAll("\\.[^1-9]+",""会想到),你可以将替换移动到地图或实用程序类,只有当Float.parseFloat(var)不抛出时才会发生它们NumberFormatException ...

但是没有真正更好的方法来进行这种任意替换。那些unicode字符串与它们代表的数字没有内在的联系。

答案 2 :(得分:0)

实数有两种选择:double(近似实数)或BigDecimal(保持精确)。

String a = "AMZN";
BigDecimal b = new BigDecimal("2.5");
double b2 = 2.5;
int c = 22;

// %s = string, %f = floating point, %d = digits, %n = newline.
System.out.printf("%s %f %d%n", a, b2, c);

对于double,你实际上并没有任何控制,但你可以使用“%。3f”格式化输出(printf),以获得3位小数。

在您的情况下,您希望使用Unicode中的分数来表示数字。

让我们用不太适合的double

来做到这一点
System.out.printf("%s %s %d%n", a, asFraction(b2), c);

static String[] fractionTexts =  { "", "¼", "½", ... }; // Maybe char
static double[] fractionValues = { 0.0, 0.25, .5, ... };

static String asFraction(double x) {
    if (x < 0) {
        return "\u2212" + asFraction(-x); // U+2212 is Unicode minus.
    }
    long integralPart = (long)x;
    double decimalsPart = x - integralPart;

    for (int i = 0; i < fractionValues.length; ++i) {
        if (almostEqual(decimalsPart, fractionValues[i]) {
            decimalPoint = "";
            return MessageFormat("{0}", integralPart) + fractionTexts[i];
        }
    }
    return MessageFormat("{0}", x);
}

private boolean almostEqual(double x, double y) {
    final double EPS = 0.0001;
    return x >= y - EPS && x <= y + EPS;
}

代码使用MessageFormat作为千位分隔符/小数分隔符。对于0.0,0.00,0.00ß0(相同的数字),它会明确地丢弃数字。 java源代码必须与java编译器具有相同的编码,并且能够保存¼和其他(如UTF-8)。

对于错误承载double,我已经介绍了almostEqual