Ajuste na função Valor por Extenso

Ola a todos, bos tarde

Estou com um problema e preciso Corrigir a função que descreve os valores por extenso na minuta de um contrato.

Ou seja se Foi digitado 559 - Tenho que escrever “Quinhentos e cinquenta e nove” (Obs Por ser com porcentagem também)

Esta função já existe e esta funcionando em teste na própria classe na criação de um método main
(acho ate um problema simples de resolver rsrsrs) mais não estou conseguindo

O problema é que todos os Atributos que eu preciso estão como String, acho que preciso quebrar eles e montar o valor

Classe responsável pela função

package br.com.teste.teste.util;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;

public class ValorExtenso {
	
	private ArrayList<Integer> nro;
	private BigInteger num;

	private String Qualificadores[][] = { { "centesimo por cento", "centesimos por cento" },
			{ "", "" }, { "mil", "mil" }, { "milhao", "milhoes" },
			{ "bilhao", "bilhoes" }, { "trilhao", "trilhoes" },
			{ "quatrilhao", "quatrilhoes" }, { "quintilhao", "quintilhoes" },
			{ "sextilhao", "sextilhões" }, { "septilhao", "septilhoes" } };
	private String Numeros[][] = {
			{ "zero", "um", "dois", "tres", "quatro", "cinco", "seis", "sete",
					"oito", "nove", "dez", "onze", "doze", "treze", "quatorze",
					"quinze", "desesseis", "desessete", "dezoito", "desenove" },
			{ "vinte", "trinta", "quarenta", "cinquenta", "sessenta",
					"setenta", "oitenta", "noventa" },
			{ "cem", "cento", "duzentos", "trezentos", "quatrocentos",
					"quinhentos", "seiscentos", "setecentos", "oitocentos",
					"novecentos" } };

	/**
	 * Construtor
	 */
	public ValorExtenso() {
		nro = new ArrayList<Integer>();
	}

	/**
	 * Construtor
	 * 
	 * @param dec
	 *            valor para colocar por extenso
	 */
	public ValorExtenso(BigDecimal dec) {
		this();
		setNumber(dec);
	}

	/**
	 * Construtor para colocar o objeto por extenso
	 * 
	 * @param dec
	 *            valor para colocar por extenso
	 */
	public ValorExtenso(double dec) {
		this();
		setNumber(dec);
	}

	/**
	 * Setando o atributo do número para colocá-lo por extenso
	 * 
	 * @param dec
	 *            Novo valor para o Número
	 */
	public void setNumber(BigDecimal dec) {
		// Converte para inteiro arredondando os centavos
		num = dec.setScale(2, BigDecimal.ROUND_HALF_UP)
				.multiply(BigDecimal.valueOf(100)).toBigInteger();

		// Adiciona valores
		nro.clear();
		if (num.equals(BigInteger.ZERO)) {
			// Centavos
			nro.add(new Integer(0));
			// Valor
			nro.add(new Integer(0));
		} else {
			// Adiciona centavos
			addRemainder(100);

			// Adiciona grupos de 1000
			while (!num.equals(BigInteger.ZERO)) {
				addRemainder(1000);
			}
		}
	}

	public void setNumber(double dec) {
		setNumber(new BigDecimal(dec));
	}

	/**
	 * Descrição do Método
	 */
	public void show() {
		Iterator<Integer> valores = nro.iterator();

		while (valores.hasNext()) {
			System.out.println(((Integer) valores.next()).intValue());
		}
		System.out.println(toString());
	}

	/**
	 * Descrição do Método
	 * 
	 * @return Descrição do Valor Retornado
	 */
	public String toString() {
		StringBuffer buf = new StringBuffer();

		int ct;

		for (ct = nro.size() - 1; ct > 0; ct--) {
			// Se ja existe texto e o atual não é zero
			if (buf.length() > 0 && !ehGrupoZero(ct)) {
				buf.append(" e ");
			}
			buf.append(numToString(((Integer) nro.get(ct)).intValue(), ct));
		}
		if (buf.length() > 0) {
			if (ehUnicoGrupo())
				buf.append(" de ");
			while (buf.toString().endsWith(" "))
				buf.setLength(buf.length() - 1);
			if (ehPrimeiroGrupoUm())
				buf.insert(0, "h");
			if (nro.size() == 2 && ((Integer) nro.get(1)).intValue() == 1) {
				buf.append(" inteiro");
			} else {
				buf.append(" inteiros");
			}
			if (((Integer) nro.get(0)).intValue() != 0) {
				buf.append(" e ");
			}
		}
		if (((Integer) nro.get(0)).intValue() != 0) {
			buf.append(numToString(((Integer) nro.get(0)).intValue(), 0));
		}
		return buf.toString();
	}
	
	public String toString(String number) {
		if(number != null) number = number.replaceAll(",", ".");
		setNumber(new BigDecimal(number));
		
		StringBuffer buf = new StringBuffer();

		int ct;

		for (ct = nro.size() - 1; ct > 0; ct--) {
			// Se ja existe texto e o atual não é zero
			if (buf.length() > 0 && !ehGrupoZero(ct)) {
				buf.append(" e ");
			}
			buf.append(numToString(((Integer) nro.get(ct)).intValue(), ct));
		}
		if (buf.length() > 0) {
			if (ehUnicoGrupo())
				buf.append(" de ");
			while (buf.toString().endsWith(" "))
				buf.setLength(buf.length() - 1);
			if (ehPrimeiroGrupoUm())
				buf.insert(0, "h");
			if (nro.size() == 2 && ((Integer) nro.get(1)).intValue() == 1) {
				buf.append(" inteiro");
			} else {
				buf.append(" inteiros");
			}
			if (((Integer) nro.get(0)).intValue() != 0) {
				buf.append(" e ");
			}
		}
		if (((Integer) nro.get(0)).intValue() != 0) {
			buf.append(numToString(((Integer) nro.get(0)).intValue(), 0));
		}
		return buf.toString();
	}

	private boolean ehPrimeiroGrupoUm() {
		if (((Integer) nro.get(nro.size() - 1)).intValue() == 1)
			return true;
		return false;
	}

	/**
	 * Adds a feature to the Remainder attribute of the Extenso object
	 * 
	 * @param divisor
	 *            The feature to be added to the Remainder attribute
	 */
	private void addRemainder(int divisor) {
		// Encontra newNum[0] = num modulo divisor, newNum[1] = num dividido
		// divisor
		BigInteger[] newNum = num.divideAndRemainder(BigInteger
				.valueOf(divisor));

		// Adiciona modulo
		nro.add(new Integer(newNum[1].intValue()));

		// Altera numero
		num = newNum[0];
	}

	/**
	 * Descrição do Método
	 * 
	 * @return Descrição do Valor Retornado
	 */
	private boolean ehUnicoGrupo() {
		if (nro.size() <= 3)
			return false;
		if (!ehGrupoZero(1) && !ehGrupoZero(2))
			return false;
		boolean hasOne = false;
		for (int i = 3; i < nro.size(); i++) {
			if (((Integer) nro.get(i)).intValue() != 0) {
				if (hasOne)
					return false;
				hasOne = true;
			}
		}
		return true;
	}

	boolean ehGrupoZero(int ps) {
		if (ps <= 0 || ps >= nro.size())
			return true;
		return ((Integer) nro.get(ps)).intValue() == 0;
	}

	/**
	 * Descrição do Método
	 * 
	 * @param numero
	 *            Descrição do Parâmetro
	 * @param escala
	 *            Descrição do Parâmetro
	 * @return Descrição do Valor Retornado
	 */
	private String numToString(int numero, int escala) {
		int unidade = (numero % 10);
		int dezena = (numero % 100); // * nao pode dividir por 10 pois verifica
										// de 0..19
		int centena = (numero / 100);
		StringBuffer buf = new StringBuffer();

		if (numero != 0) {
			if (centena != 0) {
				if (dezena == 0 && centena == 1) {
					buf.append(Numeros[2][0]);
				} else {
					buf.append(Numeros[2][centena]);
				}
			}

			if ((buf.length() > 0) && (dezena != 0)) {
				buf.append(" e ");
			}
			if (dezena > 19) {
				dezena /= 10;
				buf.append(Numeros[1][dezena - 2]);
				if (unidade != 0) {
					buf.append(" e ");
					buf.append(Numeros[0][unidade]);
				}
			} else if (centena == 0 || dezena != 0) {
				buf.append(Numeros[0][dezena]);
			}

			buf.append(" ");
			if (numero == 1) {
				buf.append(Qualificadores[escala][0]);
			} else {
				buf.append(Qualificadores[escala][1]);
			}
		}

		return buf.toString();
	}

	/**
	 * Para teste
	 * 
	 * @param args
	 *            numero a ser convertido
	 */
	public static void main(String[] args) {
		Double value = 2.13;
		ValorExtenso teste = new ValorExtenso(new BigDecimal(value));
		System.out.println("Numero  : " + (new DecimalFormat().format(Double.valueOf(value))));
		System.out.println("Extenso : " + teste.toString());
	}
}

Como esta sendo usada hoje (Acho que o erro esta nessa classe na hora estanciar a Construtor da classe “ValorExtenso”, provavelmente tenho que fazer outra coisa)

package br.com.teste.teste.template;

import java.util.ArrayList;

import br.com.teste.cjws.entity.AutorGeraHtml;
import br.com.teste.cjws.service.vo.GeraHTMLInVO;
import br.com.teste.cjws.util.ValorExtenso;

public class CJTemplate extends TemplateBase{
	
	public CJTemplate() {
		super("xxx/xx.vm");  
	}

	public String gerarContratoJuridico(GeraHTMLInVO htmlInVO){
		
		context.put("autores", htmlInVO.getContratos().getAutoresGeraHtml());
		context.put("tituloObra", htmlInVO.getContratos().getTituloObra());
		context.put("colecaoObra", htmlInVO.getContratos().getColecaoObra());
		
		ArrayList<AutorGeraHtml> autores = new ArrayList<AutorGeraHtml>();
		
		for(int i = 0; i< htmlInVO.getContratos().getAutoresGeraHtml().size(); i++){
			AutorGeraHtml autor = htmlInVO.getContratos().getAutoresGeraHtml().get(i);
			autores.add(autor);
		}
		
		context.put("dadosContas", autores);
		context.put("valorExtenso", new ValorExtenso());
		
		template.merge(context, writer);
		
		return writer.toString();	
	}
	
}

Atributos geral da classe (Vou usar apenas o que se referem a “valor”)

package br.com.teste.teste.entity;

import java.io.Serializable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class AutorGeraHtml extends Autor implements Serializable {

	/**
	 * 
	 */
	@XmlTransient
	private static final long serialVersionUID = -484881402483273046L;

	@XmlElement(name = "posicaotitulardireito")
	private String posicaotitulardireito;

	@XmlElement(name = "titular")
	private String titular;

	@XmlElement(name = "numerocessionariotitular")
	private String numerocessionariotitular;

	@XmlElement(name = "valortipoedicao")
	private String valortipoedicao;

	@XmlElement(name = "valoredicaofixa")
	private String valoredicaofixa;

	@XmlElement(name = "descricaoremuneracao")
	private String descricaoremuneracao;

	@XmlElement(name = "valoradiantamento")
	private String valoradiantamento;

	@XmlElement(name = "numeroparcelas")
	private String numeroparcelas;

	@XmlElement(name = "valorparcelas")
	private String valorparcelas;

	@XmlElement(name = "dataprimeiraparcela")
	private String dataprimeiraparcela;

	@XmlElement(name = "periodo")
	private String periodo;

	@XmlElement(name = "datapagto")
	private String datapagto;

	@XmlElement(name = "numeroexemplares")
	private String numeroexemplares;

	@XmlElement(name = "percentuallicenciamentodigital")
	private String percentuallicenciamentodigital;

	@XmlElement(name = "percentuallicenciamentodigitalgoverno")
	private String percentuallicenciamentodigitalgoverno;

	@XmlElement(name = "percentualedicaodigital")
	private String percentualedicaodigital;

	// getters and setters

	public String getPosicaotitulardireito() {
		return posicaotitulardireito;
	}

	public void setPosicaotitulardireito(String posicaotitulardireito) {
		this.posicaotitulardireito = posicaotitulardireito;
	}

	public String getTitular() {
		return titular;
	}

	public void setTitular(String titular) {
		this.titular = titular;
	}

	public String getNumerocessionariotitular() {
		return numerocessionariotitular;
	}

	public void setNumerocessionariotitular(String numerocessionariotitular) {
		this.numerocessionariotitular = numerocessionariotitular;
	}

	public String getValortipoedicao() {
		return valortipoedicao;
	}

	public void setValortipoedicao(String valortipoedicao) {
		this.valortipoedicao = valortipoedicao;
	}

	public String getValoredicaofixa() {
		return valoredicaofixa;
	}

	public void setValoredicaofixa(String valoredicaofixa) {
		this.valoredicaofixa = valoredicaofixa;
	}

	public String getDescricaoremuneracao() {
		return descricaoremuneracao;
	}

	public void setDescricaoremuneracao(String descricaoremuneracao) {
		this.descricaoremuneracao = descricaoremuneracao;
	}

	public String getValoradiantamento() {
		return valoradiantamento;
	}

	public void setValoradiantamento(String valoradiantamento) {
		this.valoradiantamento = valoradiantamento;
	}

	public String getNumeroparcelas() {
		return numeroparcelas;
	}

	public void setNumeroparcelas(String numeroparcelas) {
		this.numeroparcelas = numeroparcelas;
	}

	public String getValorparcelas() {
		return valorparcelas;
	}

	public void setValorparcelas(String valorparcelas) {
		this.valorparcelas = valorparcelas;
	}

	public String getDataprimeiraparcela() {
		return dataprimeiraparcela;
	}

	public void setDataprimeiraparcela(String dataprimeiraparcela) {
		this.dataprimeiraparcela = dataprimeiraparcela;
	}

	public String getPeriodo() {
		return periodo;
	}

	public void setPeriodo(String periodo) {
		this.periodo = periodo;
	}

	public String getDatapagto() {
		return datapagto;
	}

	public void setDatapagto(String datapagto) {
		this.datapagto = datapagto;
	}

	public String getNumeroexemplares() {
		return numeroexemplares;
	}

	public void setNumeroexemplares(String numeroexemplares) {
		this.numeroexemplares = numeroexemplares;
	}

	public String getPercentuallicenciamentodigital() {
		return percentuallicenciamentodigital;
	}

	public void setPercentuallicenciamentodigital(
			String percentuallicenciamentodigital) {
		this.percentuallicenciamentodigital = percentuallicenciamentodigital;
	}

	public String getPercentuallicenciamentodigitalgoverno() {
		return percentuallicenciamentodigitalgoverno;
	}

	public void setPercentuallicenciamentodigitalgoverno(
			String percentuallicenciamentodigitalgoverno) {
		this.percentuallicenciamentodigitalgoverno = percentuallicenciamentodigitalgoverno;
	}

	public String getPercentualedicaodigital() {
		return percentualedicaodigital;
	}

	public void setPercentualedicaodigital(String percentualedicaodigital) {
		this.percentualedicaodigital = percentualedicaodigital;
	}

	@Override
	public String toString() {
		return "Autor [idAutor=" + super.getIdAutor() + ", nomeCompleto=" + super.getNomeCompleto()
				+ ", pseudonimo=" + super.getPseudonimo() + ", cnpjCpf=" + super.getCnpjCpf()
				+ ", ie=" + super.getIe() + ", logradouro=" + super.getLogradouro() + ", numero="
				+ super.getNumero() + ", bairro=" + super.getBairro() + ", complemento="
				+ super.getComplemento() + ", cidade=" + super.getCidade() + ", uf=" + super.getUf() + ", cep="
				+ super.getCep() + ", email=" + super.getEmail() + ", nomeBanco=" + super.getNomeBanco()
				+ ", numeroConta=" + super.getNumeroConta() + ", numeroAgencia="
				+ super.getNumeroAgencia() + ", percentualdireitoautoral="
				+ super.getPercentualdireitoautoral()
				+ ", percentuallicenciamentodigital="
				+ percentuallicenciamentodigital
				+ ", percentuallicenciamentodigitalgoverno="
				+ percentuallicenciamentodigitalgoverno
				+ ", percentualedicaodigital=" + percentualedicaodigital + "]";
	}

}