Pregunta

Estamos haciendo algunas modificaciones a un proyecto heredado utilizando J2ME. Hasta ahora, los números decimales se trataban como cadenas ya que no se necesitaban operaciones aritméticas. Los valores solo se mostraron como texto.

Ahora, se requiere aritmética de precisión arbitraria. Si fuera Java se, usaría BigDecimal, pero no está presente en la API MIDP/CLDC.

Estaba tratando de resolver mi clase de decimalnumber personalizada, pero mientras solucionaba algunos errores y descubría otros nuevos en las pruebas unitarias, me di cuenta de que tendrá algo de tiempo para hacer esta clase sólida y sin errores.

Entonces, en lugar de reinventar la rueda, ¿qué alternativas podría reutilizar para este propósito? Por ejemplo, ¿puede el BigInteger y BigDecimal ¿Las clases se portan a J2ME (CLDC1.1)? He leído sobre otra pregunta que alguien intenta portar Javase's BigDecimal con Bouncycastle's BigInteger. ¿Son estos compatibles?

Cualquier ayuda será apreciada.

¿Fue útil?

Solución 2

Porté con éxito Javase's BigDecimal. Tuve que portar también estas otras clases:

  • Comparable
  • Número
  • Biginteger
  • Bits
  • MutableBiginteger
  • FirmadoMutableBiginteger

Básicamente tuve que eliminar los genéricos, algunos métodos de serialización, casi todos los métodos en BigInteger relacionado con primos y reemplazar int[].clone() con un método similar. También ajuste el compareTo métodos.

Mi objetivo era lograr la precisión arbitraria y convertir de una cuerda a BigDecimal, realmente no necesitaba nada más.

ACTUALIZAR: ¡¡¡No funciona!!!Parece que al recuperar el código fuente, mezclé clases de diferentes fuentes (las que eran de OpenJDK, Oracle Javase, ...). Todos fueron para Java 6, pero he notado algunos cambios importantes entre diferentes versiones de versión. Resulta que no están interoperando bien (o algunos de ellos contienen errores serios, pero no lo creo), por lo que el puerto ha sido un gran fracaso. Necesito una para resolver esto lo antes posible, así que ahora estoy buscando las siguientes alternativas:

  • PayPal ha publicado la API de pago móvil. La Biblioteca BlackBerry contiene un puerto BigDecimal. No es OpenSource, y las clases han sido ofuscadas, pero ahora puedo decir que está funcionando correctamente. Solo se necesitan tres archivos de clase. Espero que se haya probado a fondo, siendo cosas de PayPal (al menos espero que sí).
  • También hay SimpleBigDecimal de Bouncycastle, pero no es tan poderoso como los de Paypal o Java. Estaba interesado en tener un constructor de cadenas, que esta clase no proporciona.
  • Supongo que el puerto de Javase sería más fácil usar Javase V1.4.2. Como no tiene genéricos, puede ser más rápido desarrollarse, pero soy reacio a ir por esto porque creo que estas clases antiguas probablemente no son tan robustas como las más nuevas en 1.6 o 1.7
  • Podría implementar mi propia clase reducida para una escala dada (1 o tal vez 2 decimales) y un conjunto de métodos reducido (comparar, agregar y reducir, básicamente), pero ya sabes, me gustaría tener una solución más genérica y no solo una solución rápida.

ACTUALIZAR:
Finalmente utilicé el puerto BigDecimal de PayPal contenido en su biblioteca de pagos de movilidad para BlackBerry. BlackBerry se basa en J2ME, por lo que es perfecto para la tarea. He hecho una cantidad considerable de pruebas unitarias y puedo decir que es consistente con el comportamiento de BigDecimal de Javase.

Otros consejos

¿Ha considerado enganchar la implementación de la armonía (ver aquí)? Probablemente necesitará algo de limpieza, ya que desafortunadamente no está libre de genéricos, pero está disponible para usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top