Escrever valores por extenso

Pessoal, alguém tem algum código para escrever valores por extenso? Algo do tipo:

Entrada: 1598.35
Saída: Um mil, quinhentos e noventa e oito Reais, trinta e cinco centavos.

Estou criando um, mas imagino que exista uma maneira mais prática e inteligente do que usar vetores e sair analisando o número usando o MOD…

Agradeço de antemão.

Há muito tempo atrás alguém do GUJ tinha feito:
http://www.guj.com.br/forum/viewtopic.php?t=2556

Eu criei uma função que usa vetores sem mod	
	//Passar uma string formatada em c com o String.Format
	public string valorExtenso(string wvalor){ 
		string[] wunidade ={""," e um"," e dois"," e trez"," e quatro"," e cinco"," e seis"," e sete"," e oito"," e nove"};
		string[] wdezes = {""," e onze"," e doze"," e treze"," e quatorze"," e quinze"," e dezesseis"," e dezessete"," e dezoito"," e dezenove"};
		string[] wdezenas = {""," e dez"," e vinte"," e trinta"," e quarenta"," e cinquenta"," e sessenta"," e setenta"," e oitenta"," e noventa"};
		string[] wcentenas = {""," e cento"," e duzentos"," e trezentos"," e quatrocentos"," e quinhentos"," e seiscentos"," e setecentos"," e oitocentos"," e novecentos"};
		string[] wplural = {" bilhões"," milhões"," mil",""};
		string[] wsingular = {" bilhão"," milhão"," mil",""};
		string wextenso = "";
		string wfracao;
		wvalor = wvalor.Replace("R$","");
		string wnumero = wvalor.Replace(",","").Trim();
		wnumero = wnumero.Replace(".","").PadLeft(14,'0');
		if(Int64.Parse(wnumero.Substring(0,12)) > 0){
			for(int i=0;i<4;i++){
				wfracao = wnumero.Substring(i*3,3);
				if(int.Parse(wfracao) != 0){
					if(int.Parse(wfracao.Substring(0,3)) == 100) wextenso += " e cem";
					else{
						wextenso += wcentenas[int.Parse(wfracao.Substring(0,1))];
						if(int.Parse(wfracao.Substring(1,2)) > 10 &&int.Parse(wfracao.Substring(1,2)) < 20)wextenso += wdezes[int.Parse(wfracao.Substring(2,1))];
						else{
							wextenso += wdezenas[int.Parse(wfracao.Substring(1,1))];
							wextenso += wunidade[int.Parse(wfracao.Substring(2,1))];
						}
					}
					if(int.Parse(wfracao) > 1)wextenso += wplural[i]; 
					else wextenso += wsingular[i];
				}
			}
			if(Int64.Parse(wnumero.Substring(0,12)) > 1) wextenso += " reais";
			else wextenso += " real";
		}
		wfracao = wnumero.Substring(12,2);
		if(int.Parse(wfracao) > 0){
			if(int.Parse(wfracao.Substring(0,2)) > 10 &&int.Parse(wfracao.Substring(0,2)) < 20) wextenso = wextenso  + wdezes[int.Parse(wfracao.Substring(1,1))];
			else{
				wextenso += wdezenas[int.Parse(wfracao.Substring(0,1))];
				wextenso += wunidade[int.Parse(wfracao.Substring(1,1))];
			}
			if(int.Parse(wfracao) > 1) wextenso += " centavos";
			else wextenso += " centavo";
		}
		if(wextenso != "") wextenso = wextenso.Substring(3,1).ToUpper()  + wextenso.Substring(4);
		else wextenso = "Nada";
		return wextenso;
	}

Tenho esse exemplo:

Só para deixar registrado, tem uma implementação disso em: http://github.com/jau/porextenso.

Exemplo de uso:

CurrencyWriter cw = new CurrencyWriter();
String extenso = cw.write(new BigDecimal("137.39");

System.out.println(extenso);

Resultado:

cento e trinta e sete reais e trinta e nove centavos

Caraca, eu já fiz isso em VBA… pra escrever em espanhol huahuauhauh…

Galera,

Algúem teria uma classe que escreva os números por extenso mais em dolares?

obrigado

No meu projeto de utilidade tem em portugues, (http://www.guj.com.br/java/225445-opensutils-br4j—biblioteca-de-utilitarios-utils/1) se alguem tiver em ingles para adicionar na prox versão… estaria ótimo!! abrçs

Ola…

Tenho os seguintes numeros 27897359876000798000001 tenho que transformar esses numeros em um valor e não sei como se escreve por estenso. Alguem saberia me ajudar???

please

Revivendo o topico … alguem ainda tem esse .jar

estou fazendo um programa para prencher cheques automaticamente

vlw

Peço licença aos colegas para postar o meu projeto

http://pedroabs.wordpress.com/2011/05/24/projeto-extenso-121-cento-e-vinte-e-um/

[quote=pedroabs]Peço licença aos colegas para postar o meu projeto

http://pedroabs.wordpress.com/2011/05/24/projeto-extenso-121-cento-e-vinte-e-um/[/quote]

Obrigado Amigo…

Fiz apenas algumas modificações para não imprimir “Reais” e “Centavos”, do resto está perfeito.

Att
Douglas Junior

Desculpa reviver este tópico, mas precisava agradecer as pessoas que forneceram estas soluções.

Estou usando está aqui, pois achei fácil de entender.

[quote=jau]
Só para deixar registrado, tem uma implementação disso em: http://github.com/jau/porextenso.

Exemplo de uso:

CurrencyWriter cw = new CurrencyWriter();
String extenso = cw.write(new BigDecimal("137.39");

System.out.println(extenso);

Resultado:

cento e trinta e sete reais e trinta e nove centavos

Obrigado novamente.