Número por extenso no ireport

Tenho que emitir um recibo e devo colocar o valor por extenso, como devo proceder no ireport para obter este resultado?

Oi

francocaldas, seja bem vindo ao PJ… Olhe, o IReport nao faz isso nao, mas existem por aí algumas classes e pacotes que fazem isso, mas sao de terceiros…

T+

Jeveaux, eu ja possuo uma classe que converte valores para extenso, mas como usar esta classe junto com ireport?

a classe tem q estar no classpath do report… por ex, tu pode exibir um field assim certo?

logo, tb pode fazer assim:

Obrigado pela dica, está funcionando, tudo ok.

O vc quis dizer com a classe tem q estar no classpath do report? Como eu faco isso?
Jah tentei de varias formas mas ele nao acha o pacote da classe que eu quero chamar…
Minha classe se chama Myclasse e fica no pacote myclasse, e o caminho eh: c:/eclipse/wokspace/projeto/myclasse
e os relatorios estao em outro pacote, o caminho eh: c:/eclipse/wokspace/projeto/relatorio e eh nesse pacote que eu quero gerar os relatorios, pois eh um servlet na camada que recupera os parametros do jsp, chama a camada de banco q retorna um ResultSet que contem esse campo status que eu quero usar o metodo em cima.

Jah tentei dessas 4 formas:

new Myclasse.traduzStatus( $F{status} );

new myclasse.Myclasse.traduzStatus( $F{status} );

myclasse.Myclasse classe = new myclasse.Myclasse();
classe.traduzStatus( $F{status} );

myclasse.Myclasse classe = new Myclasse();
classe.traduzStatus( $F{status} );

Alguns da erro dizendo q o pacote nao existe, outros da erro de sitaxe locos dizendo q esperava um “;” ou um “)”, mas se eu ponho eles troca de erro pro outro e se ponho o otro inverte, e se ponho os 2 da os 2 erros… alguem pode me da uma luz?

Como ultima opcao, se ninguem puder me ajudar com isso, pode me dar uma ajuda na sintaxe que eu devo usar pra escrever um IF e mapear o status ali no iReport mesmo?

Franco estou trabalhando num projeto que tem como um de seus relatorios uma autorização de pagamento onde é necessario mostrar o valor por extenso s,o que j,a pesquisa na net e naum encontrei nenhuma classe de terceiros que tratasse isso, até achar este forum e onde vc diz que tem uma classe assim, e a questaum é a seguinte vc poderia ceder a classe pra mim?

Bom, dei uma fuçada no iReport e tem como vc montar um scriplet dentro dele, ele cria uma classe com o nome do scriplet e cira o .java e o .class dela e guarda no mesmo dir, dai ele roda certinho.

Poderia me dizer como posso criar esse scriplet no ireport pois já procurei e naum encontrei um meio de cria-lo

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

public class Extenso {

private ArrayList nro;
private BigInteger num;

    private String Qualificadores[][] = {
		{"centavo", "centavos"},
		{"", ""},
		{"mil", "mil"},
		{"milh\u00e3o", "milh\u00f5es"},
		{"bilh\u00e3o", "bilh\u00f5es"},
		{"trilh\u00e3o", "trilh\u00f5es"},
		{"quatrilh\u00e3o", "quatrilh\u00f5es"},
		{"quintilh\u00e3o", "quintilh\u00f5es"},
		{"sextilh\u00e3o", "sextilh\u00f5es"},
		{"septilh\u00e3o", "septilh\u00f5es"}
		};
private String Numeros[][] = {
		{"zero", "um", "dois", "tr\u00eas", "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 Extenso() {
	nro = new ArrayList();
}


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


/**
 *  Constructor for the Extenso object
 *
 *@param  dec  valor para colocar por extenso
 */
public Extenso(double dec) {
	this();
	setNumber(dec);
}

    /**
     *  Constructor for the Extenso object
     *
     *@param dec  String com valor para colocar por extenso
     */
    public Extenso(String dec) {
        this();
        try {
            setNumber( new BigDecimal( Double.parseDouble(dec) ) );
        } 
        catch(java.lang.NumberFormatException e) {
            setNumber( new BigDecimal( 0.0 ) );
        }
    }

/**
 *  Sets the Number attribute of the Extenso object
 *
 *@param  dec  The new Number value
 */
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));
}

/**
 *  Description of the Method
 */
public void show() {
	Iterator valores = nro.iterator();

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


/**
 *  Description of the Method
 *
 *@return    Description of the Returned Value
 */
public String toString() {
	StringBuffer buf = new StringBuffer();

	int numero = ((Integer) nro.get(0)).intValue();
	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(" real");
		} else {
			buf.append(" reais");
		}
		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];
}


/**
 *  Description of the Method
 *
 *@param  ps  Description of Parameter
 *@return     Description of the Returned Value
 */
private boolean temMaisGrupos(int ps) {
	for (; ps > 0; ps--) {
		if (((Integer) nro.get(ps)).intValue() != 0) {
			return true;
		}
	}

	return false;
}


/**
 *  Description of the Method
 *
 *@param  ps  Description of Parameter
 *@return     Description of the Returned Value
 */
private boolean ehUltimoGrupo(int ps) {
	return (ps > 0) && ((Integer)nro.get(ps)).intValue() != 0 && !temMaisGrupos(ps - 1);
}


/**
 *  Description of the Method
 *
 *@return     Description of the Returned Value
 */
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;
}

/**
 *  Description of the Method
 *
 *@param  numero  Description of Parameter
 *@param  escala  Description of Parameter
 *@return         Description of the Returned Value
 */
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) {
	if (args.length == 0) {
		System.out.println("Sintax : ...Extenso <numero>");
		return;
	}
	Extenso teste = new Extenso(new BigDecimal(args[0]));
	System.out.println("Numero  : " + (new DecimalFormat().format(Double.valueOf(args[0]))));
	System.out.println("Extenso : " + teste.toString());
}*/

}

Em que parte especificamente do ireport eu tenho que por a classe que vou utilizar

No REPORT PROPERTIES tem uma aba chamada SCRIPLET, lah vc poe pra USE THIS SCRIPLET CLASS e escreve a classe: meupacote.MinhaClasse

Olha coloquei minha classe no classpath do Ireport.
Dentro do meu TextField coloquei assim:
ClasseC.Extenso($F{vlbaixado})
Ele me retornou esse erro alguem sabe me dizer:
Error filling print… Error evaluating expression : Source text : ClasseC.Extenso($F{vlbaixado})
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :

Uma alternativa é utilizar uma biblioteca já pronta que faz a conversão de uma valor numérico em um valor por extenso

No link a seguir tem algumas sugestões
Escrever valores por extenso

Quando eu precisei eu adicionei a biblioteca ao meu projeto(que era web) e fornecia o valor por extenso como parâmetro ao relatório.