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.
Nº por extenso
8 Respostas
aqui vai uma ideia…
- primeiro teras de ver se é um valor numerico. (um teste)
- converter para String e contar o numero de caracteres
- 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”
-
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…
Bom Dia!!
Cara vc ja tentou procurar por aí??
Eu acho que ja deve ter alguma coisa pronta para fazer issu.
Falowww 
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.
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]
No site www.soujava.com.br tem um código fonte
só pra escrever um número por extenso.
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!
Legal este codigo ai, ate coloquei em meu repositorio.
Valeu
Se vc procurar por autor = hmichel vc vai encontrar alguma coisa. Lembro que ele tinha feito e dispnibilizado pra galera.