numero - quitar notacion cientifica java
JAXB clasifica para BigDecimal usando fractionDigits (3)
Si puede cambiar el XSD para usar el tipo precisionDecimal
documentado aquí, es posible que pueda usar las facetas minScale
y maxScale
configuradas con el mismo valor.
Así que aquí está mi problema. Me dieron un XSD al que mi archivo XML generado debería cumplir. Usando el org.apache.cxf.cxf-xjc-plugin
maven org.apache.cxf.cxf-xjc-plugin
y un archivo de enlace externo genero el código fuente. Pero cuando intento solucionar mi problema, el XML generado no cumple mis requisitos.
Mi XSD contiene lo siguiente:
<xsd:element maxOccurs="1" minOccurs="0" name="amount">
<xsd:simpleType>
<xsd:restriction base="xsd:decimal">
<xsd:totalDigits value="13" />
<xsd:fractionDigits value="2" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
...
<xsd:element maxOccurs="1" minOccurs="0" name="rate">
<xsd:simpleType>
<xsd:restriction base="xsd:decimal">
<xsd:totalDigits value="8" />
<xsd:fractionDigits value="5" />
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
Y la pieza generada de XML se ve así:
<amount>109.5</amount>
...
<rate>10.25</rate>
Mientras esperaba que fuera:
<amount>109.50</amount>
...
<rate>10.25000</rate>
¿Hay alguna manera de resolver este problema de una manera limpia?
Preferiría no escribir varios adaptadores para cada combinación de totalDigits
, fractionDigits
. Y como el XSD está sujeto a cambios, me gustaría dejar intacto el código fuente generado.
Tendrá que usar XmlAdapter
para este caso de uso. A continuación se muestra un archivo de enlace de muestra que lo ayudará a generarlos. La lógica estaría contenida en una clase DecimalFormatter
que contenía métodos para todos los diferentes formatos requeridos.
<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1">
<jxb:bindings schemaLocation="schema.xsd">
<jxb:bindings node="//xs:element[@name=''amount'']">
<jxb:property>
<jxb:baseType>
<jxb:javaType name="java.math.BigDecimal"
parseMethod="org.example.DecimalFormatter.parseDecimal"
printMethod="org.example.DecimalFormatter.printDecimal_2Places" />
</jxb:baseType>
</jxb:property>
</jxb:bindings>
<jxb:bindings node="//xs:element[@name=''rate'']">
<jxb:property>
<jxb:baseType>
<jxb:javaType name="java.math.BigDecimal"
parseMethod="org.example.DecimalFormatter.parseDecimal"
printMethod="org.example.DecimalFormatter.printDecimal_5Places" />
</jxb:baseType>
</jxb:property>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>
Para más información
Estoy confundido en cuanto a lo que se podría ganar manteniendo los ceros al final.
Si los ceros finales son importantes de preservar, utilice un valor de cadena en lugar de un número y use atributos para especificar su ancho y decimales.
En cualquier caso, los ceros finales nunca afectarán los cálculos usando ninguno de estos valores, y la única forma en que podría presentarlos es convirtiendo los resultados en una cadena y rellenándolos usted mismo. Para obtener ayuda haciendo eso, es posible que desee ver ...