在 Java 中使用 xstream 转换为 xml 时如何避免大双精度数的科学记数法

Posted

技术标签:

【中文标题】在 Java 中使用 xstream 转换为 xml 时如何避免大双精度数的科学记数法【英文标题】:How to avoid scientific notation of a large double while converting to xml with xstream in Java 【发布时间】:2014-04-03 02:34:08 【问题描述】:

我正在使用xstream 将对象转换为 xml 格式,而该类具有双字段。

最近我发现了一个像140936219.00这样的大double对象

但是在输出的xml文件中,变成了:

<Person>
    <name>Mike</name>
    <amount>1.40936219E8</amount>
    <currency>USD</currency>
    <currencyAmount>1.40936219E8</currencyAmount>
</Person>

Java 中的代码如下:

XStream xstream = new XStream(new DomDriver());
xstream.alias("Person", PersonBean.class);
return xstream.toXML(person);

请问在这种情况下如何避免科学记数法?基本上我想要的是:

<Person>
    <name>Mike</name>
    <amount>140936219.00</amount>
    <currency>USD</currency>
    <currencyAmount>140936219.00</currencyAmount>
</Person>

【问题讨论】:

【参考方案1】:

您可以定义自己的转换器。例如

import com.thoughtworks.xstream.converters.basic.DoubleConverter;

public class MyDoubleConverter extends DoubleConverter

    @Override
    public String toString(Object obj)
    
        return (obj == null ? null : YourFormatter.format(obj));
    

然后将其注册到具有高优先级的 XStream 对象中

XStream xstream = new XStream(new DomDriver());
xstream.alias("Person", PersonBean.class);
xstream.registerConverter(new MyDoubleConverter(), XStream.PRIORITY_VERY_HIGH);
return xstream.toXML(person);

【讨论】:

这就是解决方案。 BTW xstream 调用 toString(Object obj) 方法将对象转换为 xml? 是的。所有 SingleValueConverters 都必须覆盖 toString 以表示单值对象。对于更复杂的对象,您可以查看 com.thoughtworks.xstream.converters.Converter(这些类型的转换器可能以相同的方式注册)。【参考方案2】:

您可以使用 DecimalFormat 类,例如:

import java.text.DecimalFormat;
...
double yourBigNumber = 140936219.00;
DecimalFormat formater = new DecimalFormat("#.#"); //if you want to make it so it keeps the .00s
//then change the "#.#" to a "#.00".
String newNumber = formater.format(yourBigNumber);
System.out.println(newNumber); //Not needed ( if you couldn't tell :) )

现在您可以对大数字的 String 值做任何您想做的事情,注意 String 不是科学计数法。

【讨论】:

我知道这是一种通用的方式。但在可能的情况下,我需要将person 对象传递给xstream 以进行xml 转换,并且person 对象包含一个double 类型的字段。格式化后变成String

以上是关于在 Java 中使用 xstream 转换为 xml 时如何避免大双精度数的科学记数法的主要内容,如果未能解决你的问题,请参考以下文章

使用XStream是实现XML与Java对象的转换--简介及入门示例

使用XStream是实现XML与Java对象的转换--别名

xStream转换xml同名节点到java对象问题

使用XStream是实现XML与Java对象的转换--Object Stream

使用XStream是实现XML与Java对象的转换--注解

使用XStream是实现XML与Java对象的转换--持久化