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ã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
         *
         [EMAIL PROTECTED]  dec  valor para colocar por extenso
         */
        public Extenso(BigDecimal dec) {
                this();
                setNumber(dec);
        }


        /**
         *  Constructor for the Extenso object
         *
         [EMAIL PROTECTED]  dec  valor para colocar por extenso
         */
        public Extenso(double dec) {
                this();
                setNumber(dec);
        }


        /**
         *  Sets the Number attribute of the Extenso object
         *
         [EMAIL PROTECTED]  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
         *
         [EMAIL PROTECTED]    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
         *
         [EMAIL PROTECTED]  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
         *
         [EMAIL PROTECTED]  ps  Description of Parameter
         [EMAIL PROTECTED]     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
         *
         [EMAIL PROTECTED]  ps  Description of Parameter
         [EMAIL PROTECTED]     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
         *
         [EMAIL PROTECTED]     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
         *
         [EMAIL PROTECTED]  numero  Description of Parameter
         [EMAIL PROTECTED]  escala  Description of Parameter
         [EMAIL PROTECTED]         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
         *
         [EMAIL PROTECTED]  args  numero a ser convertido
         */
        public static void main(String[] args) {
                char ch1, ch2, ch3;
                if (args.length == 0) {
                        System.out.println("Sintax : ...Extenso <numero>");
                        return;
                }
                String sequencia = "abcdsd";
                /*
                for (int i = 0; i < sequencia.length()-2; i++) {
                                ch1 = sequencia.charAt(i);
                            ch2 = sequencia.charAt(i+1);
                            ch3 = sequencia.charAt(i+2);
                            if ((ch1+1 == ch2 && ch2+1 == ch3) || (ch1-1 ==
ch2 && ch2-1 == ch3)){
                                        System.out.println(ch1+" "+ch2+" "+ch3);
                                }
                }*/
                if (sequencia.indexOf("asd")!=-1){
                        System.out.println(sequencia.indexOf("asd"));   
                }
                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().toUpperCase());
        }
}

--- Elias Sales <[EMAIL PROTECTED]> wrote:
> de 0 a 99...
> 
> 
> public class Exercicio16 {
>   public static final void main(String args[]) {
>     int valor=0, digitos=args[0].length();
>     try {
>       valor = Integer.parseInt(args[0]);
>       if (valor<0 || valor>99) {
>         System.out.println("valores validos: 0 ..
> 99");
>         return;
>       }
>     } catch (NumberFormatException e) {
>       System.out.println("argumento invalido");
>     }
>     System.out.print("> ");
>     if(digitos==2){
>       switch(args[0].charAt(0)) {
>         case '1':
>           switch(valor) {
>             case 10: System.out.println("Dez");
> return;
>             case 11: System.out.println("Onze");
> return;
>             case 12: System.out.println("Doze");
> return;
>             case 13: System.out.println("Treze");
> return;
>             case 14: System.out.println("Quatorze");
> return;
>             case 15: System.out.println("Quinze");
> return;
>             case 16:
> System.out.println("Dezesseis"); return;
>             case 17: System.out.println("Dezesete");
> return;
>             case 18: System.out.println("Dezoito");
> return;
>             case 19: System.out.println("Dezenove");
> return;
>           }
>         case '2': System.out.print("Vinte"); break;
>         case '3': System.out.print("Trinta"); break;
>         case '4': System.out.print("Quarenta");
> break;
>         case '5': System.out.print("Cinquenta");
> break;
>         case '6': System.out.print("Sessenta");
> break;
>         case '7': System.out.print("Setenta");
> break;
>         case '8': System.out.print("Oitenta");
> break;
>         case '9': System.out.print("Noventa");
> break;
>       }
>       if (valor>10)
>         System.out.print(" e ");
>     }
>     switch(args[0].charAt(digitos-1)) {
>       case '0': if (valor==0)
> System.out.println("Zero"); break;
>       case '1': System.out.println("Um"); break;
>       case '2': System.out.println("Dois"); break;
>       case '3': System.out.println("Tres"); break;
>       case '4': System.out.println("Quatro"); break;
>       case '5': System.out.println("Cinco"); break;
>       case '6': System.out.println("Seis"); break;
>       case '7': System.out.println("Sete"); break;
>       case '8': System.out.println("Oito"); break;
>       case '9': System.out.println("Nove"); break;
>     }
>   }
> }
> ----- Original Message ----- 
> From: "Arnaldo Escossio" <[EMAIL PROTECTED]>
> To: <discussao@cejug.org>
> Sent: Wednesday, March 02, 2005 6:44 PM
> Subject: [cejug-discussao] valor por extenso
> 
> 
> Olá caros amigos,
> 
> será que alguém tem uma função que retorne um valor
> por extenso feito em
> java?
> 
> encontrei alguns na net mas todos eles eu teria de
> mexer no código pra
> ficar bom, e não disponho de tempo.
> 
> Desde já, meus agradecimentos
> -- 
> Arnaldo Escóssio
> [EMAIL PROTECTED]
> [EMAIL PROTECTED]
> 
>
----------------------------------------------------------------------------
> ---------------
> Ceara' Java User Group
> 
>   Para cancelar sua assinatura, envie um e-mail
> para:
> [EMAIL PROTECTED]
>   Para mais informacoes, mande um e-mail para:
> [EMAIL PROTECTED]
>   Falar com o administrador? e-mail para:
> [EMAIL PROTECTED]
> 
> 
> 
>
-------------------------------------------------------------------------------------------
> Ceara' Java User Group
> 
>   Para cancelar sua assinatura, envie um e-mail
> para: [EMAIL PROTECTED]
>   Para mais informacoes, mande um e-mail para:
> [EMAIL PROTECTED]
>   Falar com o administrador? e-mail para:
> [EMAIL PROTECTED] 
>  
> 
> 

__________________________________________________
Converse com seus amigos em tempo real com o Yahoo! Messenger 
http://br.download.yahoo.com/messenger/ 

-------------------------------------------------------------------------------------------

Ceara' Java User Group



  Para cancelar sua assinatura, envie um e-mail para: [EMAIL PROTECTED]

  Para mais informacoes, mande um e-mail para: [EMAIL PROTECTED]

  Falar com o administrador? e-mail para: [EMAIL PROTECTED] 

 


Responder a