package umcastec;import java.math.BigDecimal;import java.math.BigInteger;import java.util.ArrayList;import java.util.Iterator;public class Escrver_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 JExtenso() {nro = new ArrayList();}/** * Construtor** @param dec* valor para colocar por extenso */public JExtenso(BigDecimal dec) {this();setNumber(dec);}/*** Constructor for the JExtenso object* @param dec* valor para colocar por extenso */public JExtenso(double dec) {this();setNumber(dec); }/*** Sets the Number attribute of the JExtenso object** @param dec* The new Number value */public void setNumber(BigDecimal dec) {// Converte para inteiro arredondando os centavosnum = dec.setScale(2, BigDecimal.ROUND_HALF_UP).multiply(BigDecimal.valueOf(100)).toBigInteger();// Adiciona valoresnro.clear();if (num.equals(BigInteger.ZERO)) {// Centavosnro.add(new Integer(0));// Valornro.add(new Integer(0));} else {// Adiciona centavosaddRemainder(100);// Adiciona grupos de 1000while (!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 */@Override 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 � zeroif (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, ""); }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 JExtenso 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// divisorBigInteger[] newNum = num.divideAndRemainder(BigInteger.valueOf(divisor));// Adiciona modulonro.add(new Integer(newNum[1].intValue()));// Altera numeronum = 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 < hasone =" true;">= 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..19int 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();} }Main.javapackage umcastec;import java.math.BigDecimal;public class Main {public static void main(String[] args) {String extenso;Double totProd = 1000.0;JExtenso je = new JExtenso(new BigDecimal(totProd));extenso = je.toString().toUpperCase();System.out.println(extenso + " - "+ je);//sída console//UM MIL REAIS - um mil reais//} }Código enviado por Ciro S. Santos
quinta-feira, 29 de abril de 2010
Escrever valor monetário por extenso
Assinar:
Postar comentários (Atom)
Nenhum comentário:
Postar um comentário