浮点返回指数表示法

时间:2013-01-02 17:22:40

标签: java xpath

我正在编写一些代码,用于导致问题的Xpath查询。我试图从列表中读取一个随机名称,但浮点数(x)偶尔会返回指数表示法。

Random r = new Random();
float x = r.nextFloat();

final String expression = "(/list/name[@minLevel<=" + minLevel + "])" +
    "[(" + x + " * count(/list/name[@minLevel<=" + minLevel + "])) +1]";

每隔一段时间,表达式就等于:

(/name/list[@minLevel<=11])[(5.478859E-4 * count(/name/list[@minLevel<=11])) +1]

显然xpath没有用指数表示法做数学,因为我得到了这个错误:

javax.xml.transform.TransformerException: 5.478859E-4 could not be formatted to a number!

非常感谢任何有关如何防止这种情况的帮助。

3 个答案:

答案 0 :(得分:5)

要转换浮点数,您可以使用String.format()%f作为格式说明符。这永远不会使用科学记数法。

String.format("%f", x)

这也使您可以根据需要灵活地调整宽度和精度。

答案 1 :(得分:3)

不是直接将x插入字符串(... + x + ..),而是使用:

... + String.format("%f", x) + ...

您还可以使用转换上的修改器控制结果的精度和宽度。请参阅formatting documentation

答案 2 :(得分:1)

通过字符串连接构造XPath表达式通常不是最好的方法。除了注入攻击的风险之外,这意味着您将失去编译表达式一次并使用不同参数重复使用它的能力。

而是编译表达式

(/list/name[@minLevel<=$minLevel])[($x * count(/list/name[@minLevel<=$minLevel])) +1]

然后在执行时提供参数$ x和$ minLevel的值。