Nº por extenso

8 respostas
F

Estou começando com java e me deparei com uma dúvida.
Fazer com que o programa receba um valor numerico, int, exemplo, de [color=“red”]1 à 1.000.000[/color], e se digitar [color=“red”]551 [/color]ele me mostre por extenso “[color=“red”]quinhentos e cinquenta e um[/color]”.
É facil? Se alguem puder me dar um toque, fico muito grato.

8 Respostas

3

aqui vai uma ideia…

  1. primeiro teras de ver se é um valor numerico. (um teste)
  2. converter para String e contar o numero de caracteres
  3. Guardar toda a informação num Vector de tuplos…

Tuplo(int valor, String designacao);

ex:
5 -> cinco Tuplo(5,“cinco”);
50 -> cinquenta
500 -> quinhentos

e também

Tuplo2(int saltos, String designacao);

1 -> “”
2 -> “mil”
3 -> “milhões/ão”
4 -> “BILIAO”

  1. a string tem de ser partida de tres em tres

    5 555 000

neste caso da 4 saltos até chegar ao 5 … logo

— entao de 4 ate 1 … (ciclo FOR)

por exemplo no 555

pega na string que tem “555”
acrescenta um ou dois zeros à frente

pega no primeiro 5 e coloca dois zeros = 500"
       pega no segundo 5 e coloca um zero = 50
       pega no terceiro 5 e nao colocas nada :)

Agora é só percorrer os vectores e buscar a info!!!

PODES USAR HASHTABLES…

R

Bom Dia!!

Cara vc ja tentou procurar por aí??
Eu acho que ja deve ter alguma coisa pronta para fazer issu.

Falowww :smiley:

L

Acho que vc vai ter que mapear as casas decimais.

tipo assim

String[] unidades = {“ZERO”, UM”,“DOIS”, …}

String[] centenas = {"", CENTO”, DUZENTOS”, …}

e por ai vai depois pega dentro do array.
F

Nossa!

O 3rdG conseguiu dar um nó definitivo em minha cabeça. hehe
Consegui fazer, mas ficou muito cru. peguei o valor como String, convertir para Inteiro, e usei if ... else, se for 1 digitado ele mostra "um".... assim por diante, ficou longo demais.

E não sei como fazer para ele ficar fixo, porque para cada operação que realizo, ele finaliza meu programa, não volta para tela anterior para que eu possa jogar outro valor...etc..etc..

Vou postar aqui para que vocês possam me entender melhor:

import javax.swing.JOptionPane;

public class NExtenso {

	public static void main(String[] args) {
		String entrada;
		int saida;
		
		entrada = JOptionPane.showInputDialog( "Digite um Valor entre 1 e 1.000.000" );
		
		saida = Integer.parseInt( entrada );
		
		if ( saida == 1 )
		   JOptionPane.showMessageDialog(null, "O Valor digitado foi: " + "um", "Resultado",JOptionPane.PLAIN_MESSAGE);
		else
		   if ( saida == 2 )
		      JOptionPane.showMessageDialog(null, "O Valor digitado foi: " + "dois", "Resultado",JOptionPane.PLAIN_MESSAGE);
		   else
		      if ( saida == 3 )
			     JOptionPane.showMessageDialog(null, "O Valor digitado foi: " + "três", "Resultado",JOptionPane.PLAIN_MESSAGE);
		      else
		         if ( saida == 4 )
			        JOptionPane.showMessageDialog(null, "O Valor digitado foi: " + "quatro", "Resultado",JOptionPane.PLAIN_MESSAGE);
		         else
		            if ( saida == 5 )
			           JOptionPane.showMessageDialog(null, "O Valor digitado foi: " + "cinco", "Resultado",JOptionPane.PLAIN_MESSAGE);
					else
					   if ( saida == 6 )
						  JOptionPane.showMessageDialog(null, "O Valor digitado foi: " + "seis", "Resultado",JOptionPane.PLAIN_MESSAGE);
					   else
						  if ( saida == 7 )
							 JOptionPane.showMessageDialog(null, "O Valor digitado foi: " + "sete", "Resultado",JOptionPane.PLAIN_MESSAGE);
						  else
							 if ( saida == 8 )
								JOptionPane.showMessageDialog(null, "O Valor digitado foi: " + "oito", "Resultado",JOptionPane.PLAIN_MESSAGE);
							 else
								if ( saida == 9 )
								   JOptionPane.showMessageDialog(null, "O Valor digitado foi: " + "nove", "Resultado",JOptionPane.PLAIN_MESSAGE);
								else
								   if ( saida == 10 )
									  JOptionPane.showMessageDialog(null, "O Valor digitado foi: " + "dez", "Resultado",JOptionPane.PLAIN_MESSAGE);

	}
}

recebi um toque por um professor de java, que poderia usar array, só que o cabra não disso como.. hehe... estou pesquisando.

Quem puder me ajudar, ficou muito grato!
Valeu pelos toques dos que tentaram, mas sou iniciante, não consegui compreender bem o que me passaram.

Abraços...

[size="11"][color="olive"]* Editado para conter BBCode no codigo - matheus[/color][/size]

H

No site www.soujava.com.br tem um código fonte
só pra escrever um número por extenso.

H

Foi mal, tem no site www.javafree.com.br !

mas o código tah aí:

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

/**
 *  Titulo: Extenso <p>
 *
 *  Descrição: Programa converte um numero para o valor em extenso <p>
 *
 *
 *
 *@author     Sérgio Eduardo Rodrigues
 *@version    1.0
 *@created    10 de Janeiro de 2001
 */
public class Extenso {
	private ArrayList nro;
	private BigInteger num;

	private String Qualificadores[][] = {
			{"centavo", "centavos"},
			{"", ""},
			{"mil", "mil"},
			{"milhão", "milhões"},
			{"bilhão", "bilhões"},
			{"trilhão", "trilhões"},
			{"quatrilhão", "quatrilhões"},
			{"quintilhão", "quintilhões"},
			{"sextilhão", "sextilhões"},
			{"septilhão", "septilhões"}
			};
	private String Numeros[][] = {
			{"zero", "um", "dois", "três", "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);
	}


	/**
	 *  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());
	}
}

Editado para coter BBCode CODE por JuJo!

L

Legal este codigo ai, ate coloquei em meu repositorio.
Valeu

F

Se vc procurar por autor = hmichel vc vai encontrar alguma coisa. Lembro que ele tinha feito e dispnibilizado pra galera.

Criado 19 de fevereiro de 2004
Ultima resposta 15 de abr. de 2004
Respostas 8
Participantes 6