Pessoal, estou desenvolvendo uma APIzinha de validação de alguns itens comuns a nós programadores e impressão de código de barras,q vira e mexe alguem pergunta: como valido cpf?Como valido cnpj?PIS?..
Códigos para CPF,CNPJ,Código de Barras,PIS…entre outros para todos aqueles que necessitam dessas rotinas de validação.
Vá em:
https://brazilutils.dev.java.net/
e participe.
Ou deixe uma msg no nosso blog:
http://brazilutils.blogspot.com/
BrazilUtils API
450 Respostas
Também comecei um trabalho parecido usando jdk 5 soh pra brincar com ela…

Coloca isso num controle de versao pra o pessoal ajudar!
Duardor, qual cvs vc sugere(qual o melhor)?
Rafael
Podia ser o java.net mesmo… Mais conhecido e tal… Ou o sourceforge… O negócio seria definir o que seria feito e levantar os requisitos de cada estado…
Sei lá, imaginem:
br.com.guj.brasilutils.minasgerais.InscricaoEstadual
br.com.guj.brasilutils.bahia.InscricaoEstadual
br.com.guj.brasilutils.brasil.CNPJ
br.com.guj.brasilutils.brasil.CPF
E assim vai…
Inté, vamos levar isso pra frente!
Desculpe a encheção de saco … mas Brasil com Z? Pô :? hehe
putz, pensei a mesma coisa!! uma api exclusiva para brasileiros com nome em ingles!?!?
Jah tô mexendo aqui no java.net!
Pessoal, a API poderá ser útil para nós, mas quem disse que um americano/panamenho/guatemalteco não possa usá-la???É fácil para a maioria de nós entender o inglês(mesmo q porcamente),mas é foda para um gringo sacar nosso português…Eu apenas sugeri o nome BrazilUtils, mas pode ser Ararinha Azul,Jaguatirica,Dendrobata… tanto faz…o nome não é a questão!
Vamos tocar para frente!Eles demoram muito para aprovar um projeto???
Bom, como não organizei o código para postar lá ainda(java.net), e parece q tem prioridade o projeto jah com o código pronto(pelo pouco q li das instruções), gostaria de saber tipo alguem tem um nome interessante?Se colocar um nome em português, e por conseguinte deixar comentários e tudo mais em português, não traria problemas na sua aprovação?(por ser algo aparentemente local???) :?:
Nao, nao tem galho, Ironlynx. Mas ter algum codigo (dica: crie so as packages, so pros caras terem uma nocao) ja ajuda.
Bom, se o português não for um problema mesmo(fora a perda da universalização do projeto),eu chamo de UtilitariosBrasil API,ou algo assim…JBrasil API?Huhauha… alguma sugestão?
BrazilUtils estah otimo…pense grande, use ingles…
Um nome daqueles bem ambicioso e enigmático:
Locale::pt_BR
(aham, essa história de “::” é coisa de C++, embora fique legal em headers)
Talvez fosse melhor algo como
Locale< pt_BR >
para os novos adeptos do Generics…
Ou DeathStar Power Ray, sei la :mrgreen:
Vai ter validacao de CPF e CNPJ, de RG, CEP e placa de carro? 
Só pensando em coisas financeiras:
CPF, CNPJ, RG, PIS (ou NIS como gostam de chamar na Caixa)?
Número do Bolsa-Escola, do Cartão do Cidadão e outras coisas?
Validação de módulo 10 e 11, de boletos bancários e de concessionárias públicas?
De números de inscrições estaduais de todos os estados?
De números de contas dos diversos bancos?
De números de cartões de crédito (o algoritmo de Luhn vale para todas as operadoras, ou tem mais alguma coisa?)
Só de validações já deve dar um monte de trabalho.
De texto por extenso para preenchimento de cheques?
Imagine de nomes de cidades e CEPs (a última base dos Correios que tenho é a de 1998, que é muito velha por sinal; quanto custa usar uma base atualizada?)
Opa!Agora vcs começaram a ajudar…mas eu preciso é dos requisitos!
Thingol,a maioria do q vc falou jah tem muuuita coisa pronta(mas desorganizada!),o que estou achando mais fd é achar os requisitos de cada coisa(divide por isso,soma aquilo,integra 3/4 de…) , pois o q não tem pronto, nem tudo da para fazer de cbça!
Eu vou fazendo conforme for encontrando requisitos para uma coisa…
Algo q não pode faltar:
Uma classe de diferença entre datas, pois toda hora tem alguem:
Qual a dirença de uma data isso - aquilo…é soda…
Diferenca de datas nao eh um problema especifico do Brasil, Ironlynx. Pra isso nego usa Calendar ou Joda Time… 
Existem diveeeeeeersos bancos de dados maneirissimos por ai - o de CEP eh soh um deles, e tem o da Listas OESP tb, que dah a relacao CEP/Endereco/Telefone pra todos os telefones de SP. Acho que tem bases similares de outros estados tambem.
Esse tipo de base de dados geralmente eh pago e nao permite redistribuicao, mas deve haver um jeito bacana de, caso o usuario queira usar esses dados, ja ter uma API prontinha, e eh soh mexer num .properties e ta beleza. Que tal?
Gostei de JBrazil
sugestão…
Que tal BossaAPI, não deixa o nome do Brasil explicito e mostra uma coisa 100% brasileira, e apreciável tanto pela gente daqui, como lá de fora…
Gustavo Guilherme BacK
JBrazil não dah…tem uma empresa com esse nome…
BossaAPI?Humm…interessante,mas tenho medo de associações com o nome… vou acabar deixando BrazilUtils mesmo…
Quanto ao cep, jah viram esse WS para buscar cep em PHP:
http://www.maneh.org/cep/
Opa, boa héin?!
Tinha pensado exatamente nisso qdo foi citada a questão do CEP…
Pq os Correios não tem um lance desses héin?
Embora de qualquer forma seria interessante considerar a dica do cv com relação a deixar isso configurável…
Mas os correios tem. Ha algum tempo eles já aboliram o cd e agora disponibilizam uma base on-line para empresas que mantem contrato com eles. Para quem tem esse contrato com eles parece que disponibilizam uma base tambem.para uso off line.
]['s
Qual o link do projeto? Ou o nome que ele ficou.
]['s
Mas os correios tem. Ha algum tempo eles já aboliram o cd e agora disponibilizam uma base on-line para empresas que mantem contrato com eles. Para quem tem esse contrato com eles parece que disponibilizam uma base tambem.para uso off line.
]['s
Podem até ter abolido, mas ainda se encontra nos Correios a edição 2005 do CD.
BrazilUtils.Esperando a aprovação.
Quem souber uma boa página de REQUISITOS, com as fórmulas para cálculo dessas “sopa de letrinhas” ajudaria…só achei os comuns:cpf,cnpj… preciso dos de inscrições estaduais por exemplo.
Opa!Foi aprovado!Agora é só eu me entender com uns detalhes aqui e libero o código!Ainda estou a procura de requisitos…
Bom, estamos na incubadora…sab tem “brainstorming” de projeto para definir as direções a seguir.Até o momento tem eu e o rafaelgloria do guj no projeto(ambos RJ).O ideal é ter uma galera de outros estados para que o pessoal possa se virar em arranjar os requisitos de “taxas estaduais” por si próprios, pois ficará foda para a gente catar esses requisitos(tah difícil achar os nossos…parece até q escondem!).
Quem se interessar, apresente-se!
PS. Duardor, cadê vc??? :?:
Putz tu é do Rio também? Só falta ser pobre como eu também hehehehehhehh
Bom, se tiver algum serviço de corno, talvez eu possa ajudar. Coisas específicas, técnicas, de nível “operacional e não estratégico”.
Legal essa iniciativa. Uma das coisas que não gostei ao iniciar em java foi ter que prercorrer vários caminhos novamente. Reinventar a roda só que de uma linguagem para outra. Se precisarem de ajuda, estamos aí.
Sobre CNPJ e CPF eu entendi, mas o que será feito sobre CEP? Acho que no máximo pode-se criar uma máscara padrão. Como colocar todos os Ceps e suas respectivas ruas em uma biblioteca?
Alguns itens que podem fazer parte da API:
- Cálculos padronizados de impostos Federais, Estaduais e Municipais
- Valores de Alíquotas de Impostos como Constantes
- Enquadramento nas faixas e cálculo do Imposto de Renda para Sistemas de RH
- Marcação de dias com feriados Nacionais, Estaduais e Municipais
E é claro… - Implementação padrão de um Caixa 2 (sempre me pedem)
Eu gostaria de ter uma coisa como GenericNotaFiscal ou uma como AbstractOrdemDeServico com algumas funcionalidades “sacais” já prontas.
Coisas como valor/precentual de retenção de imposto, qual imposto recolher dependendo do valor e outras complicações repetitivas poderiam já estar na API.
Y! pobre.add(“Ironlynx”);
CEP ficará um pouco de lado, descobri q a base é de direitos integrais aos Correios, apesar de existirem N sites com ela disponível para baixar… não quero problemas.Deixa uma mascara padrão e tah ótimo…
Cara, suas idéias são ótimas, entre em contato comigo por private msg com seu email e icq para debatermos sobre o assunto e eu convidá-lo para o projeto!
Eu e o Rafael Gloria jah estamos codando algumas coisas, mas ainda vamos nos reunir para discutir-mos como vamos “padronizar” as classes.Eu tô pensando em chamar algum indivíduo PATTERNalista como o Philip ou o CV para compor nosso quadro, assim ele reclama do código
do projeto ANTES que ele fique com trocentas classes e fique foda refatorá-lo…
Eu tava pensando numa estrutura quase como o Duardor tinha posto:
brazilutils.br.minasgerais.InscricaoEstadual
brazilutils.br.riodejaneiro.InscricaoEstadual
brazilutils.currency //conversões monetárias inclusive por extenso
brazilutils.br.id //CPF,RG… registros nacionais
brasilutils.br.tribute //IR,impostos
Eu quero uma estrutura o mais modular possível para podermos codar com idependência, e o pessoal não se perder na hora de usar!
Acho que deveria ter uma classe principal tipo ToolKit. Ela poderia ser brazilutils.Brazil. Essa classe teria um monte de métodos para acesso simples das demais classes que forem sendo criadas no projeto como CNPJ, CPF etc.
Assim como ToolKit ela seria um Singleton e seria um canivete suíco da API.
Da mesma forma deve haver uma para coisas que variam entre os estados. Assim teríamos uma interface UF (Unidade da Federação) e 26 implementações dela RJ, SP, MG etc… Cada uma sendo um ToolKit específico. A classe Brazil poderia até ter algo getRJ(), getSP() ou getUF(String nomeUf) e/ou getUfByIndex(Integer index).
Douglas, jah te aprovei lá…
Ela poderia ser brazilutils.Brazil. Essa classe teria um monte de métodos para acesso simples das demais classes que forem sendo criadas no projeto como CNPJ, CPF etc.
Assim como ToolKit ela seria um Singleton e seria um canivete suíco da API.
Essa centralização é boa, mas neeem tudo do projeto será de coisas “Só do Brasil”.O nome é mais como referência.O package …currency terá o nome por extenso de outras moedas tb!E haverá um de pesos e medidas(báaasico né?), então não fará parte desse,por exemplo.Mas gostei da idéia!
Assim teríamos uma interface UF (Unidade da Federação) e 26 implementações dela RJ, SP, MG etc… Cada uma sendo um ToolKit específico. A classe Brazil poderia até ter algo getRJ(), getSP() ou getUF(String nomeUf) e/ou getUfByIndex(Integer index).
Será q não encheríamos ela d+ de métodos???Que tal uma classe Validation tb para coisas do tipo isNumber(),isLetter()… q todas a extenderiam para ver se são letras,números…para não ficarmos com classes tão inchadas(no final isso acaba sendo inevitável…)?
Outra coisa:
Eu acho que não se deve usar riodejaneiro e sim RJ (rj no caso de pacote), por exemplo. Fica bem menor e padroniza o tamanho das coisas com nomes compostos.
Sugestão para a estrutura de pacotes:
Colocar minasgerais ou mg no pacote não deve ser boa idéia. Portar um sistema do Rio para São Paulo implicará em reescrever código, por exemplo.
Acho que um código tipo brazilutils.RJ.getRJ().getICMS() nunca deve ser escrito. Deve-se usar algo como Brazil.getUF(***).getICMS().
*** O retorno de getUF() pode ser definido no creator de Brazil
Brazil brazil = new Brazil( new RJ() );
...
Brazil brazil = new Brazil( "RJ" );
...
Brazil brazil = new Brazil( 19 ); // 19 = Código para RJ
Dessa forma seria bem mais fácil portar o sistema.
Algumas outras coisas devem ser levadas em consideração:
Num sistema de Faturamento de Notas Fiscais meu cliente vai gerar uma fatura. Ele escolhe o cliente dele entre vários de estados diferentes. O comportamento das classes pode ser diferente para cada UF assim como o formato da NF e o código fiscal que muda de UF para UF. Mas este é um problema mais para frente…
Outra coisa:*** O retorno de getUF() pode ser definido no creator de Brazil
Caso não seja um Singleton claro! Como Singleton pode ser:
Brazil.getBrazil().setUF("RJ")
...
Brazil.getBrazil().setUF( new RJ() )
...
Brazil.getBrazil().setUF(19)
...
Brazil.getBrazil().setUF(properties.get) // sei lá
Nãaaaooo mesmo!!!Vc me entendeu malzz… riodejaneiro é nome da raiz do package, não da classe!Eu pensei em deixar os nomes por itens, ou por tipo de imposto/identificação… cara, não é melhor separar-mos as classes pelo q cada coisa realiza?Vc por exemplo, colocaria rg e cpf na mesma classe?
Eu entendi sua preocupação, mas não podermos encher demais cada classe pq esses códigos são poucos legíveis,temos coisas do tipo(calma, isso é só para testes, não para release!):
public boolean ValidadorInscEst(){
// calculo do dv1
for (int i=2, j=7; i<=7 & j>=0; i++, j--){
dv1 = dv1+(cadVetInt[j]*i);
if (i==7)i=1; // se chegar a 7 volta para o 1 (para ser adicionado e virar 2)
}
dv1 = (dv1%11); // o resto da divisão por 11
dv1 = 11-dv1; // 11 menos o valor atual (ambos fazem parte da fórmula)
System.out.println("dv1 = "+dv1);
// fim dv1
// calculo dv2
for (int i=2, j=8; i<=7 & j>=0; i++, j--){
dv2 = dv2+(cadVetInt[j]*i);
if (i==7)i=1; // se chegar a 7 volta para o 1 (para ser adicionado e virar 2)
}
dv2 = (dv2%11);
dv2 = 11-dv2;
if (dv2==10||dv2==11)dv2=0; // se for 10 ou 11 vira 0 o dv pois eh um alg soh
System.out.println("dv2 = "+dv2);
// fim dv2
return false; // provisorio
// retornara true se estiver ok e false se nao
}
Uma classe com zilhões desses o cara fica louco…
Outro detalhe:temos que documentar BEM.
E por aí vai…
Eu entendi. Quanto ao alcance do projeto, acho que ele deve contemplar justamente o que é específico de problemas de sistemas brasileiros para começar. Acho que esse é justamente o atrativo e a novidade.
Quanto a centralização, entendi sua preocupação, mas a criação das classes tipo Toolkit não interfere no que já está sendo feito. Quando alguém for utilizar a API será por classes desse tipo. Fica mais fácil “pedir” uma validação para um objeto ou classe do que criar várias para o mesmo trabalho. Veja que isso não impede, por exemplo, que eu crie um atributo tipo
CNPJ cnpj = new CNPJ("123456789");
isso permite que o meu atributo faça uma validação ao ser criado. A classe Kit permite que a mesma validação seja feita para uma classe onde o atributo CNPJ não definido como classe, mas como int por exemplo.
As duas implementações são possíveis (sem julgamentos prévios).
Quanto ao alcance do projeto, acho que ele deve contemplar justamente o que é específico de problemas de sistemas brasileiros para começar. Acho que esse é justamente o atrativo e a novidade.
Compreendo, mas não devemos fechá-lo demais, programadores estrangeiros tb necessitam de requisitos nossos(e vice-versa)!
Quando alguém for utilizar a API será por classes desse tipo. Fica mais fácil “pedir” uma validação para um objeto ou classe do que criar várias para o mesmo trabalho.
Eu sei q não impede, só estava sugerindo q seguíssemos esse mesmo caminho!(Classes para as funcionalidades!)

Y!pobre.add(“Ironlynx”);Sempre há um serviço de corno… é só chegar!
De que parte do Rio tu és?
Bom, qualquer coisa fale comigo, talvez esteja disponível para alguma coisa, ou então publique uma lista de corno-todos que eu posso catar um
Até.
Alguém por favor explique o termo “corno”?
Eu só conheço ele em um sentido, e não acho que seja deste que vocês estão falando.
[]'s
Outro dia eu ouvi falar que essa palavra tem tem vários sentidos. Não acreditei, mas agora está confirmado então! 
O sentido que eles usaram é o de “chifrudo”, o cara que se ferra sempre, etc…
Também conhecido como estagiário :mrgreen:
Hummmm… Shoes, o que você me diz disso hein? :roll:
Niterói, RJ.
Me manda um email em pvt e eu te convido para o projeto.
Pessoal, o projeto é [size=18]BrazilUtils[/size] e não RioDeJaneiroUtils… será f… para nós pegarmos requisitos inerentes de outros estados!
Mas vamos começar com o que temos, semana q vem vamos postar uns esboços lah para o pessoal ir tendo idéia de como fazer…
É somente uma sugestão,
mas os pacotes poderiam ser divididos por Regiao
tipo
sudeste.sp.*;
sudeste.rj.*;
e por ai vai
Falow…
Wagner, dessa forma regionaliza demais a coisa. E existem poucas coisas q seriam exclusivas só para aquela região(Alguma tributação talvez?).A forma como o Douglas está fazendo é a mais clara.Ah, o endereço do projeto é: https://brazilutils.dev.java.net/
Ainda não tem nenhum release/código, mas esta semana colocaremos algo lah. 
Só pra lembrar quem já tiver dado uma olhada no código: as classes que representam cada UF deveriam ser default como a classe StateAC, já acertei isso.
Fiz State como uma superclasse ao invés de uma interface porque acho que muitos métodos serão iguais entre os estados. Assim fica menos coisas para reescrever. Mesmo coisas como Inscrição Estadual podem ser iguais em vários estados, nestes casos basta implementar em State. Até o ICMS, método provável “getICMS()”, deve ser igual em vários estados. Outro detalhe é que ainda não sei se irá ser preciso variáveis comuns, neste caso a interface iria complicar.
PS: Onde vai acontecer debates ao vivo? MSN? ICQ? me avisem para eu criar uma conta. Só tenho do Yahoo.
Eu compreendo, mas não corre o risco de ficar uma POWER abstract class muuuito inchada?Eu não tenho uma noção clara a onde chegaremos devido a existência de muitos impostos,tarifas entre outras, mas tenho medo aonde poderemos chegar…
Tipo, os requisitos federais, teremos coisas do tipo bem isoladas, cpf, cnpj,pg, cada um sendo uma classe.Mas chegando nas unidades federativas,teremos muitos impostos(ICMS), atrelados numa única classe.
Poderá ficar muito monstruosa.
Douglas, eu gostei dessa sua estrutura(está limpa), mas será q deveremos seguir essa estrutura classe-estado?Ou package-estado?
Eu pensei paralelamente numa estrutura parecida, para o q for de competência federal (brazilutils.federal), para sistemas de medidas(conversões), (brazilutils.metrics) e para conversões monetárias (brazilutils.currency)…
Que código ? Fui no java.net e lá não tem nada… :shock:
Eu compreendo, mas não corre o risco de ficar uma POWER abstract class muuuito inchada?
De forma alguma. A classe State tem N métodos. Cada classe também terá esses N métodos. Não dá pra fugir disso. Veja:
No caso de impostos todas as classes de estado deverão implementar algo do tipo:
getICMS()
getIPVA()
getDUDA()
getOutroImposto()
Para validação etc:
boolean checkIscricaoEstadual(String ie)
String getDigitosInscricaoEstadual(String ie)
Cada método que se possa pensar ser específico de cada estado deve ser declarado em State e sobrer override ou não nos estados.
De qualquer forma, a classe UF do jeito que está já oforece uma alternativa a declarar algo assim
int id;
String nome;
String uf;
pois será declarada assim:
int id;
String nome;
UF uf;
Onde a classe UF só pode ser criada com uma sigla válida [SP,RJ,MG,etc]
Os métodos acima vão de bônus.
Outra coisa que me fez pensar nesta estrutura de classes é que a classe tipo 'ToolKit" - que aliás acho que deveria se chamar BrKit - deve ter algo tipo getUF. Essse método retorna um objeto da classe UF e é através dele que será possível acessar métodos específicos dos estados dentro da classe nacional. O programador apenas adapta o seu sistema dando um
BrUtil.getBrUtil.setUF( new UF("SP") )
a partir daí o getUF se comporta como “getSP” sem ficar explícito nome de estado nenhum - como já havíamos concordado. Exemplo para criar um campo InscricaoEstadual em um objeto será necessário declarar como GenericInscricaoEstadual (acabei de ter uma idéia) e depois instanciar como RJInscricaoEstadual, por exemplo. Só que se eu puser no código
GenericInscricaoEstadual ie = new RJInscricaoEstadual();
teremos o mesmo problema de portabilidade. O código deve ser assim (usando BrUtil)
GenericInscricaoEstadual ie = BrUtil.getBrUtil.getUf().createInscricaoEstadual();
Para terminar. Só não sei se cada classe StateXX deve ficar no pacote brazilutils.br.xx ou no pacote atual brazilutils.uf. Depende de como vai seguir o projeto.
Vou implementar alguma coisa da classe BrUtil e te mandar para reflexão. :roll:
Como estava refletindo no post anterior, acho que o mais simples é fazer estrutura de pacotes por estado. Porém, cada pacote xx terá sua classe StateXX. Eu fiz tudo num pacote uf porque não tenho o resto da estrutura. Da mesma forma deve ser com a Inscrição Estadual, por exemplo. deve haver um pacote brazilutils.insricaoestadual com uma (Generic)InscricaoEstadual e uma implementação em cada pacote de estado.
Quanto a impostos e coisas assim, acho que devemos tê-los em mente mas sem ficar parado até dar a “solução” para isso. Sinceramente nem sei quantos são os impostos estaduais. Acho que isso tem grande potencial de impacar o projeto. Validar CNPJ, CPF, IE; Padronizar datas e moedas já é um bom começo. A parte de tributos é realmente muito grande e pela minha experiência é bom ter um contador ao lado.
BrUtil poderia ser uma interface.Como a interface básica de Collection para as coleções.Poderíamos ter uma Outra interface(menos genérica) q a estenderia, e aí criaríamos a estrutura para InscriçãoEstadual,Icms…
Só que se eu puser no código
GenericInscricaoEstadual ie =new RJInscricaoEstadual();
Humm…não poderia rolar, tipo, um auto-boxing?
No segundo.Está claro para quem acessar a que o estado é uma unidade federativa.
Humm… a inscrição estadual muda tanto assim de um estado para outro?
Digo a forma de cálculo?
Quanto a impostos e coisas assim, acho que devemos tê-los em mente mas sem ficar parado até dar a “solução” para isso.
Concordo.Melhor nem discutir isso por enquanto…
Validar CNPJ, CPF, IE; Padronizar datas e moedas já é um bom começo. A parte de tributos é realmente muito grande e pela minha experiência é bom ter um contador ao lado.
Ok.Vamos trabalhar nas idéias que jah temos.
Estou só esperando a opinião do Philip para tirar o pé do freio.
A parte de métricas(brazilutils.metrics) eu quero terminar essa semana para jah postar lah algo funcional.
Boone, esses códigos são o “brainstorming” do pessoal, ainda não disponibilizamos nada lah.
Humm…não poderia rolar, tipo, um auto-boxing?
Estava pensando em algo como:
GenericInscricaoEstadual ie = new InscricaoEstadual(new UF("SP") );
...
GenericInscricaoEstadual ie = new InscricaoEstadual(new UF("RJ") );
Como seria com auto-boxing?
Calm down!!!Não há resto da estrutura…
Até o momento teríamos algo do tipo:
brazilutils.federal.* //requisitos federais
brazilutils.uf…//os estaduais
brazilutils.currency //monetários
brazilutils.metrics //conversoes e medidas
Algo faltando?Acho q jah estaria mais do q bom para começo de conversa…
Humm…esquece, li rápido d+ e viajei feio… agora entendi o q vc tava
falando!
Mas qto a sua estrutura de pacotes, vc teria algo a salientar em relação a que eu mostrei?
Achei que estivesse:
brazilutils.br.*
brazilutils.br.mg.*
brazilutils.br.sp.*
Onde .mg.* seriam as implementações específicas dos estados.
o pacote brazilutils.uf tem a implementação genérica de um estado e da classe UF para uso geral.
Na verdade, estava pensando em atrelar tudo(na brazilutils.uf.*).Mas essa de deixar uma para representação genérica é a opção.
Só tenho receio d q a estrutura de packages ponha medo nos programadores… eu me pergunto:“Está fácil de reconhecer essa estrutura?”
brazilutils.federal.* //requisitos federais
brazilutils.uf…//implementação genérica
brazilutils.currency //monetários
brazilutils.metrics //conversoes e medidas
brazilutils.br.estados…//implementações específicas…
*** Alterado ***
Concordo
É ISSO. 
Para mim esta beeem mais claro.
Quais são as novidades do projeto?
Douglas, a maioria só vai poder ver o projeto nos fins de semana pq não tem muito tempo…
Na última parte q vc fez (brazilutils.states…) eu gostei bastante, mas o philip ainda não deu um feedback se aquele é um bom caminho.
Essa é uma parte problemática, pois ela inchará bastante, e um mal passo tornará difícil qualquer refactoring… afinal, são + de 5000 municípios.Imagina depois q estiver com um zilhão de coisas ter q mudar muuitas delas…
Tô pensando em marcar uma reunião no sáb,mas alguns dos inscritos no projeto não me deixaram nomes ou deram detalhes via email!Se pronunciem por favor…
Em compensação, a parte de métricas(brazilutils.metrics) eu comecei a fazer sozinho mesmo(finalmente instalei o Eclipse 3.1M6!), e talvez até domingo dê para liberar um código lah(afinal, o pessoal só sabe pedir cadê o código???huahau…).Qualquer coisa fale por email!(Ou ICQ)
O CEP tem um regra.
http://www.correios.com.br/servicos/cep/cep_estrutura.cfm
Poderia-se criar um banco de dados usando o P2P… Cada um q se cadastrar o programa checa e vai guardando, validando, armazendo, um CEP muito “comum” e validado poderia ser consolidado e tradado como final, hehehe
Dah pra fazer isso e ir evoluindo o banco aos poucos. Claro, pode-se pegar uma base na net como base :D…
VELO
Velo, o problema da base é que parece que os direitos são integrais dos correios, não podemos deixar no projeto.Eu mesmo tinha a base aqui(são 30MB), mas parece que rola problemas… :roll:
Pessoal fiz um pequeno todo(Todinho???hauhauh) para algumas features que seria necessárias ao projeto.Idéias serão apreciadas!
Marcaremos uma reunião via Lohis para termos noção de como prosseguir melhor com o projeto(e separar os interesses, que é o que está sendo o maiiis difícil nesse momento de começo dele). 
Velo, o problema da base é que parece que os direitos são integrais dos correios, não podemos deixar no projeto.Eu mesmo tinha a base aqui(são 30MB), mas parece que rola problemas… :roll:
Tah, a base deles a gente não pode usar… mas a agente poderia criar a nossa propria, usando p2p 
VELO
Rodrigo, a idéia é simplificar os packages ao máximo.
brazilutils jah diz bem de onde veio o projeto…
O fato de usarmos a nomenclatura .br depois é apenas para ilustrar de onde vem o que, pois nem tudo será “brasileiro”. Alguns pesos e medidas são nacionais, aí se usará br no package, outras não, pois são internacionais,logo deixaremos sem prefixo de país.É apenas para ficar mais intuitivo. 
Velo, explica melhor essa história…
Vc tah querendo criar tipo um spider que vá coletando o CEP de quem quiser (ou deixar) ele disponível???
Olá
Só para jogar lenha:
-
Sugiro um método para padronizar endereços. Coisa do tipo transformar o que o cara digita em endereços padronizados de acordo com a EBCT. Exemplo: Av = Avenida = Aven
-
Gosto de ver sistemas com nomes de pacotes simples e acho chato sistemas onde todas as classes começam com br.com.dominiodaempresa.nomedosistema. Porém se o sistema pretende ser totalmente OpenSource é bom fazer como todo mundo faz.
[]s
Luca
Concordo…
Que tal org.brazilutils… ? Vai mudar pouca coisa e já entra no padrão…
[]'s
Sobre os pacotes vocês devem saber os procedimentos recomendados, eu prefiro seguí-los. Contanto que consigam o domínio, minhas sugestões são:
- net.brazilutils
- org.brazilutils
- net.sf.brazilutils
t++;
Qualquer que seja a base, o que eu tou interessado aqui eh o que vem depois. Assim:
base.br
base.intl
base.sp
base.sp.saopaulo
base.sp.pindamonhangaba // yeah baby!
base.sp.santaritadopassaquatro // woohoo!
base.rj
base.rj.niteroi
…
Eu acho que nao dah muito certo, pq vai virar bagunca rapidinho. Que tal:
base.financeiro
base.datas
base.cep
base.impostos
base.medidas
Simples, diz imediatamente qual a funcionalidade que esta sendo utilizada, nao separa as coisas por localizacao geografica (ja que o proprio nome da API ja disse que eh no Brasil, nao precisa muito mais que isso, e as especializacoes podem ficar na inteligencia das factories). 
Velo, explica melhor essa história…
Vc tah querendo criar tipo um spider que vá coletando o CEP de quem quiser (ou deixar) ele disponível???
Bom, na verdade naum sei o q é um spider… mas tipo, deixa o banco acessivel via web… o cara pode baixar os ceps q tem, e caso o cep q ele qr não existe ele pode enviar… se tiver cep repetido com divergencia alguem teria de resolver isso, poderia ser postado com um “bug” sei lah…
Num amadureci em nada a ideia 
VELO
base.financeiro
base.datas
base.cep
base.impostos
base.medidasSimples, diz imediatamente qual a funcionalidade que esta sendo utilizada, nao separa as coisas por localizacao geografica (ja que o proprio nome da API ja disse que eh no Brasil, nao precisa muito mais que isso, e as especializacoes podem ficar na inteligencia das factories). ;)
Isso seria na API publicada, na interna, a organização poderia ser por localidade, já que o foco é diferente.
Velo, explica melhor essa história…
Vc tah querendo criar tipo um spider que vá coletando o CEP de quem quiser (ou deixar) ele disponível???
Bom, na verdade naum sei o q é um spider… mas tipo, deixa o banco acessivel via web… o cara pode baixar os ceps q tem, e caso o cep q ele qr não existe ele pode enviar… se tiver cep repetido com divergencia alguem teria de resolver isso, poderia ser postado com um “bug” sei lah…
Num amadureci em nada a ideia
VELO
A idéia de ter um “alguma coisa” prontinha que valide CEP é obviamente um desejo de qualquer programador de sistemas comerciais. No entanto, lembrem-se que todo dia deve ser inaugurada uma rua ou ter algum nome trocado. A atualização desta informação cabe aos correios e não ao pessoal do projeto BrazilUtils. Seria uma cruz muito pesada sem necessidade. Esse é o tipo de coisa que boa parte dos sistemas têm, mas cada um tem um nível de requisito diferente. Acho válido pensar em validar o formato do cep, até compatibilizar com a UF, por exemplo. Uma coisa é implementar uma biblioteca (de classes) outra é disponibilizar uma biblioteca com uma base de dados acoplada.
Quanto a idéia do Luca achei bastante boa. Definir padrão para os tipos de Logradouro é algo bem realista e prático. Já comecei a fazer algo assim certa vez. Pensei em algo como uma classe Endereço que encapsula as partes de um endereço como: Tipo do Logradouro, Logradouro, Número e Complemento. Ex.: <Avenida> <Rio Branco>, <156>, <Sala 1123>
A parte do Tipo do Logradouro poderia ser uma classe com um método tipo getAbreviatura() que retornaria AV, R., Trav, Pça, e outras abreviaturas dos tipos de logradouro.
Olá
Antigamente em linguagem de sistemas de marketing a padronização de endereços era chamada de normalização. A idéia é simples: o cara digita da forma que ele quiser e a gente joga na base de dados tudo normalizado sem cedilha, til, acento e com as abreviaturas padronizadas. Quando se faz isto ou quando se pega o nome do logradouro a partir da base do CEP passa a ser possível fazer buscas por endereço na base de dados.
[]s
Luca
OláAntigamente em linguagem de sistemas de marketing a padronização de endereços era chamada de normalização. A idéia é simples: o cara digita da forma que ele quiser e a gente joga na base de dados tudo normalizado sem cedilha, til, acento e com as abreviaturas padronizadas. Quando se faz isto ou quando se pega o nome do logradouro a partir da base do CEP passa a ser possível fazer buscas por endereço na base de dados.
[]s
Luca
Ae alguem q me entende 
VELO
Ae alguem q me entende
VELO
Vejamos se entendi. Resumo sobre as últimas idéias levantadas:
-
Criar uma base de dados ou repositório com todos (ou quase) os CEPs para validação.
-
Criar uma funcionalidade que padronize os tipos de logradouro.
Com a segunda concordo plenamente, mas a primeira acho realmente difícil. No entanto, se alguém se quiser fazer, beleza.
Cv, na verdade, jah estamos seguindo a separação por interesses(funcionalidades), a única exceção tinha sido a parte de impostos e talz, pois tô vendo q pode ficar muuuito enjoada.
Velo consegui entender a idéia do CEP!Será q vc consegue pô-la no papel(ops, na tela)?Eu e o Douglas jah temos coisas demais para fazer, sozinhos fica complicado.(E eu jah fiquei meio desanimado depois q consegui mandar minha workspace pro saco… :x )
Douglas sua estrutura de GenericState ficou algo muito próximo do ideal.Acho q é isso. 
Mas não podemos esquecer o que o cv falou, e talvez seja necessário colocar um “.tax.br”-ou “validation.br” nos packages para ficar ainda mais claro.
Em vez de dar um pitaco vou contribuir código pra essa lib…
public CepTest extends TestCase {
public void testCepÉdeSãoPaulo() {
assertTrue("SP", new CEP("01452").getEstado());
}
}
Pronto, mas tou vendo a barrinha toda vermelha. 
Velo consegui entender a idéia do CEP!Será q vc consegue pô-la no papel(ops, na tela)?
Tipo, beleza
Mas esse mes toh envolvido com outro projetinho open source… deixa eu adiantar esse outro q pego esse novo 
VELO
Beleza Velo!Quando vc puder, sua ajuda será Bem-Vinda! 
Eu tinha feito um esquema experimental a muito tempo nesse sentido. Era mais ou menos assim:
Endereco.Logradouro.Nome
Endereco.Logradouro.Tipo // Rua. Av. Praça. etc…
Endereco.Logradouro.Bairro.Nome
Endereco.Logradouto.Bairro.Cidade.Nome
Endereco.Logradouro.Bairro.Cidade.Estado.Nome
Endereco.Logradouro.Bairro.Cidade.Estado.Pais.Nome
Endereco.Numero
Endereco.Complemento
Endereco.CEP
Ficou feio, mas era só uma experiência.
A medida que o usuário fosse usando o sistema, as tabelas seriam alimentadas com os países, estados, cidades, bairros e logradouros existentes.
Não fiz o esquema com CEPs, pq o CEP varia até na mesma rua, então teria que fazer uma variação de CEPs de acordo com o número da rua, e não tinha tempo pra fazer isso. No BrazilUtils poderia simplificar e atrelar os CEPs a cidade ou ao Bairro.
Tinha feito também um esquema com os DDIs e DDDs, mas isso eu já deixava a tabela preenchida, já que não muda.
Mas sinceramente, acho que isso foje do escopo do BrazilUtils. Achei que o BrazilUtils seria uma API pra ajudar a fazer validações e executar algumas rotinas comuns no Brasil, isso de colocar banco de dados no meio, ainda mais incompleto, não me parece uma boa idéia.
[]'s
pra ajudar a fazer validações e executar algumas rotinas comuns no Brasil, isso de colocar banco de dados no meio, ainda mais incompleto, não me parece uma boa idéia.
Cara, ninguem vai botar bd no meio de nada.Vai continuar a ser uma API de Validações e Rotinas Comuns a usuários(brasileiros ou não).
Eu jah falei, criar um banco de CEPs requer direitos PERTENCENTES aos Correios.Eu jah sei uma página onde tem um banco integral para download, mas nem posso por o link aqui pois seria infringir uma regra de direito de propriedade.
A idéia de como validar ainda é válida(e atéh mesmo uma forma de armazená-la).Poderemos ter até o meio de fazê-lo,o que é diferente de armazená-la.

Tudo bem que a base eh protegida por direito autoral. Ofereca aos usuarios a opcao de compra-la, e tenha codigo prontinho pra falar com ela 
Pra nao ficar chato, ofereca uma “versao demo” da base com uns 10 registros inventados, so pros desenvolvedores poderem garantir que tudo funciona antes de comprar a base. Simples, eficiente, e se bem documentado, fica duca 
Puxa, o correio não é uma empresa pública? O CEP não é uma informação pública? Não?
Bom, esse cadastro deveria ser publicamente acessível na minha opinião, ou possível de ser adquirido com uma taxa de custo.
Puxa, o correio não é uma empresa pública? O CEP não é uma informação pública? Não?Bom, esse cadastro deveria ser publicamente acessível na minha opinião, ou possível de ser adquirido com uma taxa de custo.
Renato manipular o CEP não tem problemas.Mas TODA a base é de propriedade dos correios.(Eles devem comercializá-la ou algo assim para o caixa2 dos funcionários… :twisted: )
Li num fórum(acho que foi o do PosgreSQL), que tinha um bando de empecilhos em usá-la(a base completa).
Mas quem precisa, é só pesquisar q acha.São uns 10MB zipados(+ de 30 no total- Ei,VC!Eu nao estou estimulando ninguém a baixá-la, aviso de isenção TOTAL de responsabilidade!
).
Só disse que ela existe… 
Bom galera, também quero participar!
Logo, logo mandarei alguns fontes! 
Turma, acabei de fazer um código que ele irá converter o tipo de logradouro para sem extensão.
Ex:
"Av. São Miguel" para "Avenida São Miguel"
você aida poderá escolher o tipo de retorno, se será em upper, lower ou normal case.
O código segue abaixo, criei mais uma classe como teste, para vê o resultado.
Você cria uma instância da classe logradouro passando para o seu construtor o endereço e o tipo de retorno, e em um método getter, você pega o valor alterado. Mesmo que o seu endereço não tenha nada o que alterar, não dará problema.
Classe para o BrazilUtils
import java.util.StringTokenizer;
/**
* <t>Classe para transformação de padrões de logradouros. Ex:
* Você digita como endereço, "Av. Sete de Setembro" e então transformado para Avenida Sete de Setembro
* você poderá perdir o retorno em normal case, upper case ou lower case. </t>
* @author Inocêncio T. de Oliveira
* @nick Grinvon
*/
public class logradouro
{
public static final int RETURN_NORMALCASE = 0;
public static final int RETURN_UPPERCASE = 1;
public static final int RETURN_LOWERCASE =2;
private String end;
private String retorno = new String();
private String tok[] = null;
private StringTokenizer tokens = null;
private int fRetorno;
/**
* Construtor que receberá o endereço e o formato de saída de texto
* @param endereco
* @param formatoRetorno
*/
public logradouro(String endereco, int formatoRetorno)
{
this.end = endereco;
this.fRetorno = formatoRetorno;
transformar();
}
/**
* Método privado que faz a transformação do logradouro
*/
private void transformar()
{
tokens = new StringTokenizer(end);
tok = new String[tokens.countTokens()];
int x=0;
while (tokens.hasMoreTokens())
{
String logr = tokens.nextToken();
logr = transLogradouro(logr);
tok[x] = logr;
x++;
}
montarSaida(tok);
}
/**
* Transforma um logradouro em sua forma não extensa
* @param logradouro
* @return
*/
private String transLogradouro(String logradouro)
{
//caso seja Avenida
if ((logradouro.equalsIgnoreCase("AV.")) || (logradouro.equalsIgnoreCase("AV")))
if (fRetorno == this.RETURN_NORMALCASE)
logradouro = new String("Avenida");
else if (fRetorno == this.RETURN_LOWERCASE)
logradouro = new String("avenida");
else if (fRetorno == this.RETURN_UPPERCASE)
logradouro = new String("AVENIDA");
//novos casos de logradouro serão aqui implementados
return logradouro;
}
/**
* Monta a saída para ser pega em um método getter
* @param tokens
*/
private void montarSaida(String[] tokens)
{
if (fRetorno == this.RETURN_NORMALCASE)
{
for (int i=0; i < tokens.length; i++)
{
if (i != tokens.length -1)
retorno += tokens[i] + " ";
else
retorno += tokens[i];
}
}
if (fRetorno == this.RETURN_LOWERCASE)
{
for (int i=0; i < tokens.length; i++)
{
if (i != tokens.length -1)
retorno += tokens[i].toLowerCase() + " ";
else
retorno += tokens[i].toLowerCase();
}
}
if (fRetorno == this.RETURN_UPPERCASE)
{
for (int i=0; i < tokens.length; i++)
{
if (i != tokens.length -1)
retorno += tokens[i].toUpperCase() + " ";
else
retorno += tokens[i].toUpperCase();
}
}
}
/**
* Método getter para obter o logradouro modificado
* @return
*/
public String getLogradouro()
{
return retorno;
}
}
Classe que usei de teste
public class teste
{
public teste()
{
String endereco = "Av. Sete de Setembro n1766";
logradouro logr = new logradouro(endereco,logradouro.RETURN_UPPERCASE);
System.out.println("Endereco: " + logr.getLogradouro() + ".X");
}
public static void main(String[] args)
{
new teste();
}
}
Algumas melhorias ainda pode vim, como você não precisar criar uma objeto da classe para cada tipo de retorno, podendo nessa mesma instância definir retornos diferentes, mas isso não é tão importante assim.
Bom espero ter ajudo, e espero que esse código esteja lá. Pelo menos a idéia dele :wink:
Turma, acabei de fazer um código que ele irá converter o tipo de logradouro para sem extensão.Ex:
“Av. São Miguel” para “Avenida São Miguel”
você aida poderá escolher o tipo de retorno, se será em upper, lower ou normal case.
Algumas melhorias ainda pode vim, como você não precisar criar uma objeto da classe para cada tipo de retorno, podendo nessa mesma instância definir retornos diferentes, mas isso não é tão importante assim.
Bom espero ter ajudo, e espero que esse código esteja lá. Pelo menos a idéia dele
![]()
Legal pra caramba…
Soh tenho uma critiva, vai ter de ser feito uma “engenharia” maior…
Sente só o número de logradouros possíveis:
Aeroporto
Alameda
Área
Avenida
Campo
Chácara
Colônia
Condomínio
Conjunto
Distrito
Esplanada
Estação
Estrada
Favela
Fazenda
Feira
Jardim
Ladeira
Lago
Lagoa
Largo
Loteamento
Morro
Núcleo
Parque
Passarela
Pátio
Praça
Quadra
Recanto
Residencial
Rodovia
Rua
Setor
Sítio
Travessa
Trecho
Trevo
Vale
Vereda
Via
Viaduto
Viela
Vila
Algumas sugestoes para a classe Logradouro:
:arrow: O nome da classe tem que comecar com letra maiuscula (Logradouro)
:arrow: A instrucao
if ((logradouro.equalsIgnoreCase("AV.")) || (logradouro.equalsIgnoreCase("AV")))
pode ser simplificada para
String l = logradouro.toUpperCase();
if (l.equals("AV") || l.equals("AV."))
:arrow: new String(“xxx”) eh redundante. Somente
logradouro = "Avenida";
ja basta.
:arrow: Usar StringBuffer no metodo montarSaida. Ou seja, trocar
retorno += tokens[i] + " ";
por
StringBuffer retorno = new StringBuffer(tokens.length * 2);
...
retorno.append(tokens[i]).append(" ");
Um ultimo detalhe: fazer no braco, um-a-um, os if() para verificar as abreviacoes e entao tomar uma acao eh trabalho pra xuxu.
Rafael
:arrow: A instrucaoif ((logradouro.equalsIgnoreCase("AV.")) || (logradouro.equalsIgnoreCase("AV")))pode ser simplificada para
String l = logradouro.toUpperCase(); if (l.equals("AV") || l.equals("AV."))
Ou ainda:
String l = logradouro.toUpperCase();
if ("AV".equals(l) || "AV.".equals(l))
[]'s
Grivon,
Dei uma rápida olhada no código e gostaria de sugerir algumas coisas:
Dentro do método transLogradouro() deveria ter um else final retornando um tipo de logradouro padrão caso passe algo não presente nas possibilidades.
Acho que você deveria criar um constructor Logradouro(String endereco) e dentro dele chame Logradouro(String endereco, int formatoRetorno) passando o formato padrão, senão você obriga o programador a colocar um parâmetro eventualmente desnecessário.
Acho que você deveria usar duas variáveis internas para receber o endereço (variável end) como: tipo e nome, para oi tipo e o nome dologradouro. Em uma delas você coloca a primeira palavra antes do espaço. Essa é o tipo do logradouro (um dos presentes na lista que o velo postou). Na outra você coloca o que sobrou, que é o nome da rua ou avenida etc. Na hora dce transformat você trabsforma só a variável tipo, e no Get você devolve tipo + nome;
Observe o que o velo disse pois também estava pensando am algo assim e vi que deverá ter, dentro da classe, toda aquela lista que ele mostrou.
Vou conversar com o IronLinx e vamos criar um pacote “endereco” ou similar. Acho que a classe Logradouro deve fazer parte de uma maior chamada Endereco onde teria ainda o número e um complemento. Se tem Bairro, Cidade e o resto ainda devemos discutir.
Obrigado galera pelas sugestões,
Como eu tava no trabalho, fiz o código rápido, e então não deu tempo de da uma aperfeiçoada melhor.
Sim eu poderia usar StringBuffer, alias adoro SB, vou pensar em substituir e fazer algumas alterações, de qualquer forma estou feliz galera. Tendo mais tempo faço todas as modificações e posso criar coisas novas.
Legal Grinvon! :thumbup:
Junte-se a nós!
Aproveitando o barco, peguei um código para converter nums por extenso aqui no: http://www.portaljava.com/home/downloads/Extenso.java
Meu objetivo é quando tiver 3 casas depois da vírgula imprimir tipo:
12.123 (doze reais e cento e vinte três milésimos de real), mas tô tomando um couro do código… :x
//package brazilutils.currency.br
import java.math.BigInteger;
import java.math.BigDecimal;
import java.util.*;
import java.text.DecimalFormat;
/**
* Titulo: NumeroPorExtenso <p>
* Note:This class was writen in portuguese
* Descrição: Programa converte um numero para o valor em extenso <p>
*
*
*@author Ironlynx based on code found on PortalJava(www.portaljava.com)
* owned by Sérgio Eduardo Rodrigues
*@version 0.1
*@created 20/04/2005
*/
public class NumeroPorExtenso {
private List numeroLista;
private BigInteger num;
private String Qualificadores[][] = {//array de 2 linhas e 14 colunas[2][14]
{"milésimo de real","milésimos de real"},//[0][0] e [0][1]
{"centavo", "centavos"},//[1][0] e [1][1]
{"", ""},//[2][0],[2][1]
{"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"},
{"setilhão", "setilhões"},
{"octilhão","octilhões"},
{"nonilhão","nonilhões"},
{"decilhão","decilhões"}
};
private String Numeros[][] = {
{"zero", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez",
"onze", "doze", "treze", "quatorze", "quinze", "dezesseis", "dezessete", "dezoito", "dezenove"},
{"vinte", "trinta", "quarenta", "cinqüenta", "sessenta", "setenta", "oitenta", "noventa"},
{"cem", "cento", "duzentos", "trezentos", "quatrocentos", "quinhentos", "seiscentos",
"setecentos", "oitocentos", "novecentos"}
};
/**
* Construtor
*/
public NumeroPorExtenso() {
numeroLista = new ArrayList();
}
/**
* Construtor
*
*@param dec valor para colocar por extenso
*/
public NumeroPorExtenso(BigDecimal dec) {
this();
setNumero(dec);
}
/**
* Constructor for the Extenso object
*
*@param dec valor para colocar por extenso
*/
public NumeroPorExtenso(double dec) {
this();
setNumero(dec);
}
public void setNumero(BigDecimal dec) {
// Converte para inteiro arredondando os centavos
num = dec
.setScale(2,BigDecimal.ROUND_HALF_UP)// até 3 casas depois da vírgula
.multiply(BigDecimal.valueOf(100))
.toBigInteger();
// Adiciona valores
numeroLista.clear();
if (num.equals(BigInteger.ZERO)) {
// Centavos
numeroLista.add(new Integer(0));
// Valor
numeroLista.add(new Integer(0));
}
else {
// Adiciona centavos
addRemainder(100);
// Adiciona grupos de 1000
while (!num.equals(BigInteger.ZERO)) {
addRemainder(1000);
}
}
}
public void setNumero(double dec) {
setNumero(new BigDecimal(dec));
}
/**
* Description of the Method
*
*@return Description of the Returned Value
*/
public String toString() {
StringBuilder buf = new StringBuilder();
int numero = ((Integer) numeroLista.get(0)).intValue();
int count;
for (count = numeroLista.size() - 1; count > 0; count--) {
// Se ja existe texto e o atual não é zero
if (buf.length() > 0 && ! ehGrupoZero(count)) {
buf.append(" e ");
}
buf.append(numToString(((Integer) numeroLista.get(count)).intValue(), count));
}
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 (numeroLista.size() == 2 && ((Integer)numeroLista.get(1)).intValue() == 1) {
buf.append(" real");
} else {
buf.append(" reais");
}
if (((Integer) numeroLista.get(0)).intValue() != 0) {
buf.append(" e ");
}
}
if (((Integer) numeroLista.get(0)).intValue() != 0) {
buf.append(numToString(((Integer) numeroLista.get(0)).intValue(), 0));
}
return buf.toString();
}
private boolean ehPrimeiroGrupoUm() { //milhar
if (((Integer)numeroLista.get(numeroLista.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
numeroLista.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) numeroLista.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)numeroLista.get(ps)).intValue() != 0 && !temMaisGrupos(ps - 1);
}
/**
* Description of the Method
*
*@return Description of the Returned Value
*/
private boolean ehUnicoGrupo() {
if (numeroLista.size() <= 3)
return false;
if (!ehGrupoZero(1) && !ehGrupoZero(2))
return false;
boolean hasOne = false;
for(int i=3; i < numeroLista.size(); i++) {
if (((Integer)numeroLista.get(i)).intValue() != 0) {
if (hasOne)
return false;
hasOne = true;
}
}
return true;
}
boolean ehGrupoZero(int ps) {
if (ps <= 0 || ps >= numeroLista.size())
return true;
return ((Integer)numeroLista.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);
//int milhar= (numero%1000);
StringBuilder buf = new StringBuilder();
if (numero != 0) {//se zero não for digitado!!!
if (centena != 0) {
if (dezena == 0 && centena == 1) {
buf.append(Numeros[2][0]);//cem!
}
else {
buf.append(Numeros[2][centena]); //todos as demais centenas
}
}
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) { //até 1
buf.append(Qualificadores[escala][0]);//singular
}
else { //maior do que 1 adiciono o plural
buf.append(Qualificadores[escala][1]);//plural
}
}
return buf.toString();
}
public static void main(String[] args) {
if (args.length == 0) {
System.out.println("Digitar no console : java NumeroPorExtenso <numero>");
return;
}
NumeroPorExtenso teste = new NumeroPorExtenso(new BigDecimal(args[0]));
System.out.println("Numero : " + (new DecimalFormat().format(Double.valueOf(args[0]))));
System.out.println("Extenso : " + teste.toString());
}
}//fim da classe NumeroPorExtenso
Se alguém quiser tentar,valeuzzz…
PS. Em último caso acho q converto tudo para String e vou testando casa a casa(e as vírgulas), mas ficaria um código 10x mais chato de ler do q esse…
Iron,
Eu tinha criado um programa desse em pascal, do qual ele convertia até o milhar, mas infelizmente não o tenho mais, mas acho que irei tentar fazer uma conversão dessa em Java. 
Iron,
Só mais uma coisa! Já está criado a área no CVS?
Bom galera, fiz algumas modificações e acho que agora ficou melhor. Inclusive criei uma interface para colocar os tipos de logradouro, agora ficou melhor:
Class Logradouro
import java.util.StringTokenizer;
/**
* <t>Classe para transformação de padrões de logradouros. Ex:
* Você digita como endereço, "Av. Sete de Setembro" e então transformado para Avenida Sete de Setembro
* você poderá perdir o retorno em normal case, upper case ou lower case. </t>
* @author Inocêncio T. de Oliveira
* @nick Grinvon
*/
public class Logradouro implements LogradouroIf
{
public static final int RETURN_NORMALCASE = 0;
public static final int RETURN_UPPERCASE = 1;
public static final int RETURN_LOWERCASE =2;
private String end;
private String retorno = new String();
private String tok[] = null;
private StringTokenizer tokens = null;
private int fRetorno;
/**
* Construtor que receberá o endereço e o formato de saída de texto
* @param endereco
* @param formatoRetorno
*/
public Logradouro(String endereco, int formatoRetorno)
{
this.end = endereco;
this.fRetorno = formatoRetorno;
}
/**
* Método privado que faz a transformação do logradouro
*/
private void transformar()
{
tokens = new StringTokenizer(end);
tok = new String[tokens.countTokens()];
int x=0;
while (tokens.hasMoreTokens())
{
String logr = tokens.nextToken();
logr = transLogradouro(logr);
tok[x] = logr;
x++;
}
montarSaida(tok);
}
/**
* Transforma um logradouro em sua forma não extensa
* @param logradouro
* @return
*/
private String transLogradouro(String logradouro)
{
// o logradouro, a condicao, e o logradouro de saida
logradouro = converterLogradouro(logradouro,"AV",LGR_AVENIDA);
logradouro = converterLogradouro(logradouro,"AV.",LGR_AVENIDA);
//novos casos de logradouro serão aqui implementados
return logradouro;
}
/**
* Monta a saída para ser pega em um método getter
* @param tokens
*/
private void montarSaida(String[] tokens)
{
if (fRetorno == RETURN_NORMALCASE)
{
for (int i=0; i < tokens.length; i++)
{
if (i != tokens.length -1)
retorno += tokens[i] + " ";
else
retorno += tokens[i];
}
}
if (fRetorno == RETURN_LOWERCASE)
{
for (int i=0; i < tokens.length; i++)
{
if (i != tokens.length -1)
retorno += tokens[i].toLowerCase() + " ";
else
retorno += tokens[i].toLowerCase();
}
}
if (fRetorno == RETURN_UPPERCASE)
{
for (int i=0; i < tokens.length; i++)
{
if (i != tokens.length -1)
retorno += tokens[i].toUpperCase() + " ";
else
retorno += tokens[i].toUpperCase();
}
}
}
/**
* Pega o tokem do logradouro e o converte
* @param logradouro
* @param saidaLogradouro
* @return
*/
private String converterLogradouro(String logradouro, String condicao, String saidaLogradouro)
{
if (logradouro.equalsIgnoreCase(condicao))
if (fRetorno == this.RETURN_NORMALCASE)
logradouro = saidaLogradouro;
else if (fRetorno == this.RETURN_LOWERCASE)
logradouro = saidaLogradouro.toLowerCase();
else if (fRetorno == this.RETURN_UPPERCASE)
logradouro = saidaLogradouro.toUpperCase();
return logradouro;
}
/**
* Método getter para obter o logradouro modificado
* @return
*/
public String getLogradouro()
{
transformar();
return retorno;
}
public void setTipoRetorno(int tipoRetorno)
{
retorno = "";
this.fRetorno = tipoRetorno;
}
}
Interface de logradouros
/**
* Interface contendo os logradouros padrões
* @author Inocêncio T. de Oliveira
* @nick Grinvon
*/
public interface LogradouroIf
{
public static final String LGR_AVENIDA = "Avenida";
}
Classe usada como teste
public class TesteLogradouro
{
public TesteLogradouro()
{
String end = "Av. Sete de Setembro";
Logradouro logr = new Logradouro(end, Logradouro.RETURN_NORMALCASE);
System.out.println("Endereco: " + logr.getLogradouro());
logr.setTipoRetorno(Logradouro.RETURN_UPPERCASE);
System.out.println("Endereco: " + logr.getLogradouro());
logr.setTipoRetorno(Logradouro.RETURN_LOWERCASE);
System.out.println("Endereco: " + logr.getLogradouro());
}
/**
*
* @param args
*/
public static void main(String[] args)
{
TesteLogradouro testeLogradouro = new TesteLogradouro();
}
}
Boa Grinvon!! 
Mais tarde eu olho legal isso, pois tô tendo que ler um pouco de UML para um trabalho…
Se associe como coder lah no projeto.
Quanto ao CVS, eu ainda não aprendi a mexer direito nesse troço( :roll: ),
Mas vou configurar esse WinCVS direito para ver o que dah…
Só lançaremos um “release” depois que fizermos uma reunião via lohis(provavelmente lah para Quarta da Semana que vem pois o pessoal tah viajando), definindo todos os passos a serem seguidos…
Quanto a classe de nums por extenso, ela só funciona até centavos(eu quero até milésimos de real),além de ter um Bug em números grandes.Eu jah tô começando a fazer só com String(ainda tah cons uns erros) e transformando em CharArray, mas fica muuuito difícil de ler devido que há muitos if´s aninhados… se tiver solução melhor, pode postar.! 
Se vc quise eu lhe ajudo no CVS. 
Certo, talvez eu tente fazer ainda hj uma solução para números extensos!
Pergunta: de onde veio o requisito de ter 3 tipos de casing diferentes? O usuario da API nao pode chamar toUpperCase e toLowerCase se quiser? :?
Eh vero…
Fica até mais facil…
C passa um default pra ele… Lah ele faz o q qr…
VELO
Pessoal, aqui segue uma proposta para a interface da classe Endereço. Observem que o retorno para UF, CEP e Logradouro é Object, pois retornará a UF já implementada, a classe CEP que está sendo feita e uma classe Logradouro baseada na que o grivon está fazendo.
public interface Endereco {
/**
* @return Returns the bairro.
*/
public abstract String getBairro();
/**
* @return Returns the cep.
*/
public abstract Object getCep();
/**
* @return Returns the cidade.
*/
public abstract String getCidade();
/**Aveniva Rio Branco 156, sala 1010
* ^-------^
* @return Returns the complemento.
*/
public abstract String getComplemento();
/**
* @return Returns the endereco.
*/
public abstract String getEndereco();
/** tipoLogradouro + nomeLogradouro
* @return The Complete Logradouro
*/
public abstract Object getLogradouro();
/**Aveniva Rio Branco 156, sala 1010
* ^--------^
* @return Returns the nomeLogradouro.
*/
public abstract String getNomeLogradouro();
/**Aveniva Rio Branco 156, sala 1010
* ^-^
* @return Returns the numero.
*/
public abstract String getNumero();
/**Aveniva Rio Branco 156, sala 1010
* ^-----^
* @return Returns the tipoLogradouro.
*/
public abstract String getTipoLogradouro();
/**
* @return Returns the uf.
*/
public abstract Object getUf();
/**
* @param bairro The bairro to set.
*/
public abstract void setBairro(String bairro);
/**
* @param cep The cep to set.
*/
public abstract void setCep(Object cep)throws EnderecoException;
/**
* @param cidade The cidade to set.
*/
public abstract void setCidade(String cidade);
/**Aveniva Rio Branco 156, sala 1010
* ^-------^
* @param complemento The complemento to set.
*/
public abstract void setComplemento(String complemento);
/** tipoLogradouro + nomeLogradouro
* @param logradouro The complete Logradouro to set.
*/
public abstract void setLogradouro(Object logradouro);
/**Aveniva Rio Branco 156, sala 1010
* ^--------^
* @param nomeLogradouro The nomeLogradouro to set.
*/
public abstract void setNomeLogradouro(String nomeLogradouro);
/**Aveniva Rio Branco 156, sala 1010
* ^-^
* @param numero The numero to set.
*/
public abstract void setNumero(String numero);
/**Aveniva Rio Branco 156, sala 1010
* ^-----^
* @param tipoLogradouro The tipoLogradouro to set.
*/
public abstract void setTipoLogradouro(String tipoLogradouro);
/**
* @param uf The uf to set.
*/
public abstract void setUf(Object uf) throws EnderecoException;
}
Para CEP e UF há ainda a obrigatoriedade de tratar um possível erro, pois pode-se passar uma UF ou CEP inválidos. Aguardo sugestões.
Eu não vejo problema dessa forma!
Mas se quiserem alterar para o projeto, pode alterar, apenas fiz um código de exemplo, e se quiserem criar um novo, que criem!
Cv, calma.Ele teve uma idéia.No momento somos um conjunto de idéias que estão tentando se associar para um fim.Não há requisitos.Há necessidades.O que tiver de ser aproveitado, será. 
Antes idéias confusas, e a vontade de fazer, do que palavras vazias. 
Calma cara, o homem fala o que quer e faz o que pode. 
Sua presença é Bem-Vinda e sua colaboração mais ainda.Apenas fique esperto pois críticas virão(o que é normal!), e todo mundo o fará.Os códigos que tenho aqui estão BEEM piores que esse.
Jah te passei meu ICQ via PM. 
Para CEP e UF há ainda a obrigatoriedade de tratar um possível erro, pois pode-se passar uma UF ou CEP inválidos. Aguardo sugestões.
trate-as.(as exceções) Para CEP vc tah seguindo o link do Velo?
Grivon, tô instalando o wincvs.Se até amanhã eu não me acertar, peço um help para vc. 
Iron, você também pode usar o jCVS www.jcvs.org, é bom, é fácil, roda em java, não exige nenhum dependência. E eu o utilizo no Windows e no Linux, principalmente no Linux.
O Wincvs é muito legal também, e é feito em Python.
O repositório será mesmo o do java.net?
Sim.Será lah memso.
Para CEP e UF há ainda a obrigatoriedade de tratar um possível erro, pois pode-se passar uma UF ou CEP inválidos. Aguardo sugestões.
trate-as.(as exceções) Para CEP vc tah seguindo o link do Velo?
Na verdade o lugar correto de tratar essa Exception é onde um objeto tipo Endereco estiver sendo criado.
Endereco end = new EnderecoBasico(); // ou New EnderecoValido()
end.setLogradougo('Avenida Rio Branco');
end.setNumero('156');
end.setComplemento('1010');
end.setBairro('Centro');
end.Cidade('Rio de Janeiro');
try {
end.setUf('RJ');
// na classe EnderecoValido poderia ser setUf(new UF('RJ');
} catch (EnderecoException endex) {
// trata aqui algo como new UF('XX') -
// UF inválida gera UFException,
// dentro de EnderecoValido é tratada e
// repassa uma EnderecoException
}
try {
end.setCep('20102543');
// na classe EnderecoValido poderia ser setCep(new Cep('20102543');
} catch (EnderecoException endex) {
// trata aqui o erro do CEP
}
EnderecoBasico é uma classe que tem um string para cada campo do endereco e implementa a interface endereco. Ela não testa nem valida UF, CEP ou Logradouro (acho que logradoudo não tem validação).
EnderecoValido é uma classe que no lugar de String para UF, CEP e Logradouro tem um objeto de cada uma dessas classes e faz a validação que a classe determinar em sua implementação.
O programador usa a que melhor lhe convier.
ATENÇÃO: Já fizemos o registro do domínio brazilutils.org, portanto quem estiver fazendo algum código já pode colocar os pacotes da seguinte forma:
org.brazilutils.*
org.brazilutils.currency
org.brazilutils.id
org.brazilutils.tribute
etc…
Grivon: se você concordar, poderia usar o pacoe org.brazilutils.address para classes de endereço, inclusive Logradouro. Não precisa criar subpacotes, por enquanto não vejo nada tão grande só para endereços. Se vai fazer uma interface para Logradouro seria bom colocar os métodos getNomeLogradouro() e getTipoLogradouro(). Na maioria dos sistemas logradouro é “Rua Riachuelo”, mas para sistemas de distribuidores de energia e telefônicas separar o tipo do logradouro é crucial. Se tiver tempo implemente um método que receba um logradouro inteiro e desmembre estas duas partes, seria bem útil.
Alguem me da um motivo serio pra os nomes dos pacotes, metodos e documentacao do codigo serem em ingles!? “org.brazilutils.currency” soa esquisitissimo pra mim, ja que 99,999999999999% + 1 dos usuarios dessa API vao ser brasileiros ou lusófonos, non? 
Pessoalmente também acho que deveríamos “aportuguesar” tudo, mas acho que também vai ter alguma coisa de uso geral (brasileiros ou não), assim o Ironlinx começou fazendo em inglês e assim foi. O próprio nome do projeto é com “z”.
Talvez fique alguma coisa em português. As classes de endereço por exemplo estão sendo feitas com nomes em português. Ainda não teve nem uma reunião, assim que acontecer acho que devemos tomar uma decisão quanto a língua utilizada.
Uma boa solução seria colocar a documentação nas duas línguas.
Também sou a favor de deixar toda a documentação, especificação e projeto em português. Afinal, apenas ela é destinado a tal público!
Epa! Pessoal, o projeto pode ser BrazilUtils, mas tem tudo será de requisitos brasileiros… isso é um conjunto de utilitários(nacionais ou não!), medidas por exemplo(KM para milhas,cm para pés…) podem (e devem) ser universalizadas.Moedas(.currency), pow será (uma vez pronto) relativamente fácil mudar uma classe que diz um número em reais para libras não acha(chato é fazê-la 100% pq eu tô apanhando de uma aqui…ugh!)?
O projeto em si, não se destina só a métricas nacionais(vou até mudar a descrição q está falando isso).
Ah outras coisas como converter binário para ascii e por aí vai…
Eu pensei em termos um pack geral(.utilities) onde o pessoal possa contribuir com o que quiser nesse aspecto de utilitários para um programador(conversões de base,manipulação de imagem, ou qualquer código q seja um serviço de corno, e vc leve muito tempo pensando para chegar em lugar nenhum…contribuam!).
Cv, se vc perceber, esse projeto está sendo aquele banco de códigos q há tempos o pessoal tava querendo fazer e ficava só na promessa, agora estamos tentando…
Se eu for voto vencido, eu aceito a documentação todo em português numa boa…apesar disso cortar uma “universalização do projeto”.
Claro que temos diretrizes básicas(validações-impostos e ids, pack monetários, pesos e medidas ), mas a idéia é não amarrá-lo, a exceção do pack principal(o de validações!).
Vamos tentar chegar a um acordo sobre a questão da língua. Concordo com o Ironlinx que o projeto não tem só coisas do Brasil (apesar do nome sugerir), sendo assim, acho que para padronizar os nomes dos pacotes e das classes em inglês parece a melhor decisão.
Por outro lado, se não houver uma documentação em português a API limita muito o grupo de possíveis usuários no Brasil. Isso pra não falar que muitas empresas costumam encrencar com documentações que não sejam em português.
SUGESTÂO: os pacotes tipo org.brazilutils.metrics, org.brazilutils.currency devem ficar com as classes e documentação em inglês. Os pacotes de uso praticamente exclusivo de progamas brasileiros tipo org.brazilutils.endereco, podem ficar em português. Inclusive os pacotes em português poderiam todos ficar dentro de org.brazilutils.br.* o que ficasse fora de br caracteriza que é de uso geral.
+1 Ingles nas classes
+100 Ingles OU Portugues, sem misturar
Bom, quinta-feira faremos uma reunião online ás 21horas para discutirmos esses e outros problemas.Aguardem o anuncio oficial da reunião.
Qual quinta? E online por IRC?
Axo q foi quinta passada… feriado 
VELO
Velo, é nessa próxima quinta(28/04)!
Vou dar um UP no tópico q falava isso para o pessoal não ficar perdido!
Velo, é nessa próxima quinta(28/04)!
Vou dar um UP no tópico q falava isso para o pessoal não ficar perdido!
Online via o que? 
Grinvon, leia esse tópico:
http://www.guj.com.br/posts/list/23343.java
Mais uma ferramentinha útil pro canivete suiço: formatar tempo em unidades, tipo, passo 1934853ms e ele me retorna uma string dizendo que são 32 minutos XX segundos … e por ai vai.
To procurando aqui mas nao acho :roll: … se nao achar mesmo eu contribuo com esse negocio pq vou precisar de qq jeito 
Mais uma ferramentinha útil pro canivete suiço: formatar tempo em unidades, tipo, passo 1934853ms e ele me retorna uma string dizendo que são 32 minutos XX segundos … e por ai vai.To procurando aqui mas nao acho :roll: … se nao achar mesmo eu contribuo com esse negocio pq vou precisar de qq jeito
![]()
Isso é facil, passa o tempo em milisegundos pro GregorianCalendar e pede pra ele a hora, minuto e segundo… nunca testei, mas deve dar…
VELO
Nonon velo … é tempo por extenso, o mesmo que dinheiro ou quantidade …
Este processo durou:
5 dias, 3 horas, 20 minutos e 16 segundos … por exemplo.
Eh bem, esse eh o famoso The other level, hehehhe
VELO
Pessoal, eu tô vendo que o tópico do fórum aqui tá bombando e eu não recebo nenhuma mensagem do mailing list do projeto. Hoje eu entrei de novo lá e verifiquei se eu não tinha feito besteira e saído da lista, mas a lista está vazia! :shock:
Que tal usarem a lista do projeto ao invés do fórum do GUJ. Eu to vendo que tem posts enormes com código e tudo mais. Eu esperando notificação de galera pelo dev@brazilutils e nada… achei até que o projeto tinha esfriado!
Agora eu entro e vejo que tem reunião pra amanhã! heheh! :lol:
Eita! Como faço pra participar da reunião?!
E agora eu vou ter que ler todos esses posts pra ficar por dentro! :evil:
[]s!
Na verdade “todos esees post” tem mais idéias do que definições. Sobre a reunião de quinta, veja aqui:
smota , sua idéia é super bem-vinda, e sua ajuda , melhor ainda! 
Dango(quem eh vc no projeto?O rawfosgod ou o capterm???), foi mal pelo lance da mail list, mas em projetos OS, eu sou newba!(Aliás, Grinvon, acho q vou precisar da sua ajuda com o wincvs… hehehe)
Eu tava falando com o douglas e os demais sobre detalhes do projeto via email mesmo.Vou ativar ela jah…
Mas não se preocupe Dango.Tudo q temos são classes disconexas, pois a estrutura definitiva , principalmente no que tange ordem dos packages e idiomas , será decidido amanhã na reunião.Feito isso, passaremos a discutir sobre o que interessa, ou seja, um release.
Acho esse melhor… :lol:
[]'s
A gente podia tentar resolver esse problema do telefone…
http://www.guj.com.br/posts/list/18999.java
VELO
Velo não lidaremos com nada gráfico a princípio(jah pensou se ela acaba com MaskFormatter), mas essa sua idéia é boa.Mas deveria a Sun prover isso.
Bom,na nossa reunião ganhou a documentação toda em inglês, classes dos packs genéricos em inglês, e classes específicas em portugues(pois algumas siglas e palavras ficariam sem sentido transliteradas ao inglês).
1 Parte da reunião sobre a BrazilUtils
Pessoal,
já que o Scottys já postou todo o conteúdo vou fazer um breve resumo:
Essa primeira reunião foi mais para iniciar um entrosamento entre os particiantes e dar um gás que tava faltando. Definimos algumas tarefas bem como a estrutura de pacotes. Até o momento está assim:
Pacotes gerais, para uso de brasileiros ou não
org.brazilutils.metrics - api de conversão
org.brazilutils.currency - api de moedas e valores
org.brazilutils.validation - api de classes de validação
org.brazilutils.utilities - api de classes de utilidade diversa
Pacote específico, para uso predominantememte de brasileiros
org.brazilutils.br - classes que representam entidades comuns em sistemas brasileiros: CPF, CEP, Endereco, UF etc
A maioria achou por bem fazer as classes e a documentação dos pacotes gerais em inglês por se tratar de algo comum a todos. Quanto ao pacote br, as classes serão nominadas em português, pois em inglês ficaria bizarro. Por exemplo: Cep ao invés de PostalCod, Endereco ao invés de Address etc. A documentação do pacote br será feita em inglês para seguir o padrão.
Em https://brazilutils.dev.java.net tem um zip com algum código. Quem quiser baixar e dar uma olhada já pode.
Sugestões e críticas serão bem vindas.
HEEEEEEIN!? :shock: :shock: :shock:
/**
Sets the address value.
@see Endereco
*/
public void setEndereco(Endereco e) { ... }
Que horror! 
Prefiro os metodos em ingles e documentado em PT_BR 
Mas, a maioria manda!
VELO
Desculpe galera, esqueci completamente de entrar no #guj, estava no #Java e ninguém me procurou 
Mas estou dentro! 
Opa!!!
Ainda vou separar um tempo para dar uma lida melhor neste projeto do BrasilUtils. Até onde estou vendo, se este projeto for realmente para frente realmente será muito útil para todos!
VocÊs vão mesmo usar WinCVS? Vc estão definindo plataforma de desenvolvimento ou é só criar a classe e colocar no repositório?
Haverá um coordenador para disponibilizar as tarefas e implementações que poderão ser realizadas e implementadas?
Desculpe por estas perguntas. Não quero tirar esta discussão do foco principal. (Podem responder por PM se quiserem!). Pois confesso que não acompanhei o desenrolar deste tópico, apesar de ele estar sempre bém movimentado! Por isso, não fiquem bravo com a sugestão q vou dar aqui…
Quando começar as implementações definitivamente, vcs criarão algum grupo de discussão? Ou até mesmo um tópico aqui no GUJ (Igual ao do JForum) para tratar sobre este projeto?
Seria legal, por que assim ficaria mais fácil de acompanhar o andamento deste projeto!
Abraços!
Thiago
Mais pitado:
“João”, quando vai pros isteites, não vira John, aidna é João. Alguém já fez entrevista para trabalho em inglês?
Não vejo o exemplo do CEP como blocante. CEP é um “nome” brasileiro, mas ate´então não tem problema…
So, our position is to PJ consultants, do you like it or prfere CLT?
Philip Gringo é igual Philip tupiniquim :mrgreen: , ou seja, tem coisa que nao muda estando lá, ou cá! 
Também não achei lindo. :lol: Mas depois de duas horas discutindo foi se é tudo ingles, tudo português, como fazer Logradouro em inglês etc, esse foi o consenso.
Acho melhor começarmos assim a não começar. 
Ao longo do trabalho talvez façamos alguma alteração.
PS: acho que no pacote endereco não revisei a doc, por isso não estranhem docs em duas línguas, vou acertar isso.
Sugestões e críticas ser/ao bem vindas.
Quem é o arquiteto responsavel do projeto?
Na verdade não há ninguém com essa responsabilidade. Eu e o Ironlinx estamos escrevendo essas primeiras classes de forma bem experimental.
Imaginei. Mas na minha humilde opiniao acho que alguem devia fazer essa tarefa. Assumir um pouco mais a responsabilidade de definicao da estrutura do projeto em si, pacotes, classes, etc.
Isso nao precisa ser feito por uma unica pessoa, podem dividir o projeto em sub-projetos e dividir essa responsabilidade. Pra mim sem fazer isso o projeto vai cair no limbo logo, logo com divergencia de opniao, coisas repetidas, e codigo mal escrito que nao foi “revisado” por alguem com um conhecimento do todo do projeto.
É só uma dica, se acharem valido legal.
]['s
Galera se possível, já que hoje é sexta, quem puder, entrar no canal #guj, para podemos debater mais, até por que quinta eu faltei! 
Fábio, beleza! Ainda estamos engatinhando e coloquei aquele código lá mais para receber críticas mesmo. Tava todo mundo discutindo sobre coisas diferentes, agora acho que todos têm idéia geral dos objetivos e alcance do projeto. Apesar da discordância sobre a língua. :lol:
Grivon, vamos marcar às 19:00h, quem puder aparece.
Thiago, para vc que tah preocupado com versoes e tal, entre no projeto,
lah em https://brazilutils.dev.java.net/ mesmo q como observer, inscreva-se na lista de developers( [email removido]
) , que vc receberá um email de discussão sobre o que acontece no projeto.
Um tópico será criado para que o pessoal possa acompanhar o desenrolar do projeto.
Cv, eu discuti com o PEAS tb sobre isso e não há saida fácil…
Melhor começar-mos dessa forma. 
Fábio, eu tinha convidado ateh o Philip para mais ou menos fazer essa função(acho q ele tah meio enrolado com o trabalho), que no final eu e o douglas estamos fazendo.
Por enquanto até que as coisas estão + ou - definidas, e não serão muitas, senão não começamos.
Grinvon, se der eu apareço, mais ainda tenho que ver o código do Douglas(aliás, quem eh Newton???Douglas?Vc tem “nome de guerra”?)
e agora eu tô indo colar grau lah no McDonalds e pro meu curso de Oracle. 
Douglas(aliás, quem eh Newton???Douglas?Vc tem “nome de guerra”?)
![]()
:lol: Acho que te mandei o email pelo email do meu pai. Eu praticamente administro um provedor caseiro:lol: . Tem conta de email do trabalho do meu pai, laboratório da namorada, da minha mãe…
Vai aparecer lá hoje? 19:00 tá bom?
Douglas, para mim não dah… minha colação é nesse horário…(eu jah tô ateh atrasado,pois tenho Curso de Oracle antes)
Se estiver de madrugada, eu converso contigo…senão, dom eu vou estar o dia todo vendo o Projeto.
Tou saindo agora do trampo, são 8:37, devo chegar em casa umas 9:20
Grinvon, não dah para te adicionar ao projeto mandando email para mim como vc fez na lista de dev.Vc tem que criar um login no java.net e depois clique em “entrar nesse projeto” no brazilutils escolhendo o “cargo”(Developer,Observer…) q vc quer… a lista é só para discussão!
Smota, entra lah no projeto(mesmo q como Observer!) para participar.
https://brazilutils.dev.java.net/
Vamos marcar uma discussão com o pessoal, para vermos o que a versão 0.1 deverá possuir.(Vou postar algumas idéias na lista de devs)
Velo, o Douglas tah fazendo uma opção legal de pacote de Telefone para aquele problema(de diferentes estados) que você havia falado(acho q foi vc se não foi, foi malz…).
O pacote telefone está dentro do zip (brazilutils.zip) na página do projeto para quem quiser dar uma olhada. Tem uma interface gráfica para testar as entradas e saídas do telefone e como fica a formatação naqueles casos discutidos neste post:
http://www.guj.com.br/posts/list/18999.java
Adiantando: usar uma máscara *###-#### já é um começo. No caso de ser possível telefones com 7 ou 8 dígitos é necessário padronizar onde fica o espaço vazio (início ou fim) antes de pensar em outra coisa.
Pessoal…
Entrei no grupo do BrazilUtils também lá no Java.net! Acompanharei o andamento do projeto com vocês e tentarei ajudá-los sempre que necessário!
Contem comigo! 
Abraços!
Thiago
Caramba! Agora pela manhã recebi três pedidos de entrada no projeto. Aproveitando o entusiasmo, vou colocar aqui a idéia para classe Logradouro, parte integrante da Endereco, para que venham opiniões e ajuda. Não segui a idéia inicial do Grivon, pis adaptei ao padrão do resto do pacote, mas os métodos de conversão e transformação estão lá co um TODO para ele (Grivon) ou quem mais se interressar em ajudar.
Inicialmente temos a interface Logradouro que além do próprio Logradouro recebe e fornece o Logradouro separado em Tipo e Nome. Como já vimos isso é fundamental, e dessa forma fica opicional.
public interface Logradouro {
public String getLogradouro();
public void setLogradouro(String logradouro);
public String getTipo();
public void setTipo(String tipo);
public String getNome();
public void setNome(String nome);
}
Implemteii uma classe básica para representar um logradouro. Ela tem um objeto Tipo e um Nome.
public class LogradouroBasico implements Logradouro {
private TipoLogradouro tipo = new TipoLogradouro();
private NomeLogradouro nome = new NomeLogradouro();
public String getLogradouro() {
return tipo.getTipo() + " " + nome.getNome();
}
public void setLogradouro(String logradouro) {
tipo.setLogradouro(logradouro);
nome.setLogradouro(logradouro);
}
public String getTipo() {
return tipo.getTipo();
}
public void setTipo(String tipo) {
this.tipo.setTipo(tipo);
}
public String getNome() {
return nome.getNome();
}
public void setNome(String nome) {
this.nome.setNome(nome);
}
}
Classe para Tipo do Logradouro:
public static final String AEROPORTO = "Aeroporto";
public static final String ALAMEDA = "Alameda";
public static final String AREA = "Área";
public static final String AVENIDA = "Avenida";
public static final String CAMPO = "Campo";
public static final String CHACARA = "Chácara";
public static final String COLONIA = "Colônia";
public static final String CONDOMINIO = "Condomínio";
public static final String CONJUNTO = "Conjunto";
public static final String DISTRITO = "Distrito";
public static final String ESPLANADA = "Esplanada";
public static final String ESTACAO = "Estação";
public static final String ESTRADA = "Estrada";
public static final String FAVELA = "Favela";
public static final String FAZENDA = "Fazenda";
public static final String FEIRA = "Feira";
public static final String JARDIM = "Jardim";
public static final String LADEIRA = "Ladeira";
public static final String LAGO = "Lago";
public static final String LAGOA = "Lagoa";
public static final String LARGO = "Largo";
public static final String LOTEAMENTO = "Loteamento";
public static final String MORRO = "Morro";
public static final String NUCLEO = "Núcleo";
public static final String PARQUE = "Parque";
public static final String PASSARELA = "Passarela";
public static final String PATIO = "Pátio";
public static final String PRACA = "Praça";
public static final String QUADRA = "Quadra";
public static final String RECANTO = "Recanto";
public static final String RESIDENCIAL = "Residencial";
public static final String RODOVIA = "Rodovia";
public static final String RUA = "Rua";
public static final String SETOR = "Setor";
public static final String SITIO = "Sítio";
public static final String TRAVESSA = "Travessa";
public static final String TRECHO = "Trecho";
public static final String TREVO = "Trevo";
public static final String VALE = "Vale";
public static final String VEREDA = "Vereda";
public static final String VIA = "Via";
public static final String VIADUTO = "Viaduto";
public static final String VIELA = "Viela";
public static final String VILA = "Vila";
private static final String[] TIPOS = {
AEROPORTO, ALAMEDA, AREA, AVENIDA,
CAMPO, CHACARA, COLONIA, CONDOMINIO,
CONJUNTO, DISTRITO, ESPLANADA, ESTACAO,
ESTRADA, FAVELA, FAZENDA, FEIRA,
JARDIM, LADEIRA, LAGO, LAGOA,
LARGO, LOTEAMENTO, MORRO, NUCLEO,
PARQUE, PASSARELA, PATIO, PRACA,
QUADRA, RECANTO, RESIDENCIAL, RODOVIA,
RUA, SETOR, SITIO, TRAVESSA,
TRECHO, TREVO, VALE, VEREDA,
VIA, VIADUTO, VIELA, VILA
};
public static final String AEROPORTO_AB = "";//TODO
public static final String ALAMEDA_AB = "";//TODO
public static final String AREA_AB = "";
public static final String AVENIDA_AB = "Av";
public static final String CAMPO_AB = "";//TODO
public static final String CHACARA_AB = "";//TODO
public static final String COLONIA_AB = "";//TODO
public static final String CONDOMINIO_AB = "";//TODO
public static final String CONJUNTO_AB = "";//TODO
public static final String DISTRITO_AB = "";//TODO
public static final String ESPLANADA_AB = "";//TODO
public static final String ESTACAO_AB = "";//TODO
public static final String ESTRADA_AB = "Est";
public static final String FAVELA_AB = "";//TODO
public static final String FAZENDA_AB = "";//TODO
public static final String FEIRA_AB = "";//TODO
public static final String JARDIM_AB = "";//TODO
public static final String LADEIRA_AB = "";//TODO
public static final String LAGO_AB = "";//TODO
public static final String LAGOA_AB = "";//TODO
public static final String LARGO_AB = "";//TODO
public static final String LOTEAMENTO_AB = "";//TODO
public static final String MORRO_AB = "";//TODO
public static final String NUCLEO_AB = "";//TODO
public static final String PARQUE_AB = "";//TODO
public static final String PASSARELA_AB = "";//TODO
public static final String PATIO_AB = "";//TODO
public static final String PRACA_AB = "";//TODO
public static final String QUADRA_AB = "";//TODO
public static final String RECANTO_AB = "";//TODO
public static final String RESIDENCIAL_AB = "";//TODO
public static final String RODOVIA_AB = "";//TODO
public static final String RUA_AB = "R";
public static final String SETOR_AB = "";//TODO
public static final String SITIO_AB = "";//TODO
public static final String TRAVESSA_AB = "";//TODO
public static final String TRECHO_AB = "";//TODO
public static final String TREVO_AB = "";//TODO
public static final String VALE_AB = "";//TODO
public static final String VEREDA_AB = "";//TODO
public static final String VIA_AB = "";//TODO
public static final String VIADUTO_AB = "";//TODO
public static final String VIELA_AB = "";//TODO
public static final String VILA_AB = "";//TODO
private static final String[] ABREVIATURAS = {
AEROPORTO_AB, ALAMEDA_AB, AREA_AB, AVENIDA_AB,
CAMPO_AB, CHACARA_AB, COLONIA_AB, CONDOMINIO_AB,
CONJUNTO_AB, DISTRITO_AB, ESPLANADA_AB, ESTACAO_AB,
ESTRADA_AB, FAVELA_AB, FAZENDA_AB, FEIRA_AB,
JARDIM_AB, LADEIRA_AB, LAGO_AB, LAGOA_AB,
LARGO_AB, LOTEAMENTO_AB, MORRO_AB, NUCLEO_AB,
PARQUE_AB, PASSARELA_AB, PATIO_AB, PRACA_AB,
QUADRA_AB, RECANTO_AB, RESIDENCIAL_AB, RODOVIA_AB,
RUA_AB, SETOR_AB, SITIO_AB, TRAVESSA_AB,
TRECHO_AB, TREVO_AB, VALE_AB, VEREDA_AB,
VIA_AB, VIADUTO_AB, VIELA_AB, VILA_AB
};
private List list;
private String tipo = "";
private boolean normalize = false;
public TipoLogradouro() {
super();
list = new ArrayList();
for (int i=0; i < TIPOS.length; i++){
list.add(TIPOS[i]);
}
}
public boolean equals(Object obj) {
return this.toString().equals(obj.toString());
}
public String getTipo() {
return tipo;
}
public void setLogradouro(String logradouro){
for (int i=0; i < logradouro.length(); i++){
if (Character.isSpaceChar(logradouro.charAt(i))){
break;
} else {
tipo = tipo + logradouro.charAt(i);
}
}
if (normalize) doNormalize();
}
public void setTipo(String tipo) {
this.tipo = tipo;
}
public String toString() {
return getTipo();
}
public boolean isNormalize() {
return normalize;
}
public void setNormalize(boolean normalize) {
this.normalize = normalize;
}
private void doNormalize(){
//TODO To Grivon Do!
}
E uma para o nome do Logradouro:
public class NomeLogradouro {
private String nome = "";
public void setLogradouro(String logradouro){
boolean afterSpace = false;
for (int i=0; i < logradouro.length(); i++){
if (Character.isSpaceChar(logradouro.charAt(i)) &&
!afterSpace){
afterSpace = true;
} else if (afterSpace){
nome = nome + logradouro.charAt(i);
}
}
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public boolean equals(Object obj) {
return this.toString().equals(obj.toString());
}
public String toString() {
return getNome();
}
}
Pra que vai ser usado os arrays TIPO e ABREVIATURA?
]['s
Possivelmente para correr o array procurando um tipo ou sua abreviatura. Também para facilitar a carga da List.
Se vai ser só neste caso para validar os tipos enviados, nao seria melhor colocar em um Map?
]['s
Provavelmente sim. Estou acostumado a usar arrays. Na classe UF acho que também tem uma alteração dessas para fazer. Vou dar uma olhada em Maps para fazer a modificação. 
Se puder posta um código de como você pensou usar um map.
Provavelmente sim. Estou acostumado a usar arrays. Na classe UF acho que também tem uma alteração dessas para fazer. Vou dar uma olhada em Maps para fazer a modificação.![]()
Se puder posta um código de como você pensou usar um map.
É, so nao comeca a largar Map pra tudo que é lado pq tem seu custo isso.
]['s
Pessoal, estava acertando algumas classes e me deparei com uma consequência da mistura de idiomas na criação das classes. Existem classes como CepBasico e CepValido. Hoje fui fazer o mesmo na Uf e ficou UfValida (com A no final). Não gostei muito. Gostaria da sugestões sobre qual padrão usar para os nomes das classes:
CepBasico, CeValido, UfBasica etc
ou
BasicCep, ValidCep, BasicUf etc
ou outra coisa…??
Por favor indiquem o porquê da opção.
Sobre o logradouro:Coloquei no método doNormalize() uma chamada a uma classe TipoNormalizer para facilitar a leitura e separar as tarefas.
Dsiviotti,
A suas classes de logradouro já estão prontas? Ou precisa adaptar mais alguma coisa?
Não. Só a estrutura básica. Aquela idéia de normalizar e transforma AV em Avenida está por fazer. Dá uma olhada no código e você vai ver uma classe chamada TipoNormalizer. Ela recebe o tipo do logradouro (AV, R. Rua, etc) e transforma no tipo padronizado. Na prática você pode pegar o seu código e colocar dentro dela. Basta manter o constructor recebendo um parâmetro (como está) e o método getNormalized() como saída para a transformação.
Tem alguma coisa no CVS? Dei uma navegada ontem e tava vazio…
VELO
Pessoal, ontem eu entrei no site do Sintegra - http://www.sintegra.gov.br/ - e encontrei os requisitos e formas de cálculo das inscrições estaduais. Cada uma é de uma forma. Eu implementei uma AbstractInscricaoEstadual para servir de superclasse para cada classe específica (uma por estado). Ela tem vários métodos que as subclasses vão precisar, inclusive o cálculo de pesos para cada dígito. Assim as classes dos estados ficaram co 5 ou 6 métodos para implementar somente, incluindo o de validação principal.
Superclasse Abstrata:
/*
* Created on 10/04/2005
*/
package org.brazilutils.br.uf.ie;
import java.text.ParseException;
import org.brazilutils.utilities.GenericNumberComposed;
import org.brazilutils.utilities.NumberComposed;
import org.brazilutils.validation.Validable;
import org.brazilutils.validation.ValidationException;
/**Represents a IE (Inscrição Estadual)<br>
* Each state implements a IE<p>
*
* The Subclasses must implement:<p>
* getDigitCount() - Determines how much Digits the IE must have<br>
* getDvCount() - Determines how much Check Digits the IE must have<br>
* getMask() - Determines the mask must be applyed in toString() and getValue() methods<br>
* getPesosList() - the list of Pesos<br>
* isValid() - the validation method
*
* @see <a href="http://www.sintegra.gov.br/insc_est.html"></a>
*
* @author Douglas Siviotti
*/
public abstract class AbstractInscricaoEstadual
implements NumberComposed, Validable{
public static final int MOD11 = 11;
private GenericNumberComposed number= new GenericNumberComposed();
private Pesos pesos = new Pesos();
/**
*
*/
public AbstractInscricaoEstadual() {
super();
try {
number.setMask(getMask());
} catch (ParseException e) {
e.printStackTrace();
}
pesos.setPesosString(getPesosList());
}
public int applyPesos(int digitBegin, int digitEnd, Pesos p){
int result = 0;
if (p == null) p = pesos;
for (int i=digitBegin; i <= digitEnd; i++){
result = result + getDigitValue(i) * p.getValue(i);
}
return result;
}
/**The count of digits by default
* @return The number of digits by default
*/
public abstract int defaultDigitCount();
/**
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj) {
return this.toString().equals(obj.toString());
}
/**Returns the char of digit requested
* @param digitPosition The digit position
* @return the char on digitPosition
*/
public char getDigit(int digitPosition){
return getNumber().charAt(digitPosition);
}
/**Returns the value of a digit
* @param digitPosition The digit position
* @return the value of the digit
*/
public short getDigitValue(int digitPosition){
String s = "" + getDigit(digitPosition);
return Short.parseShort(s);
}
/**<pre>
* 12345-67
* ^
* This is the fisrt Check Digit (Dv1)
* Check Digite = 6
* Position = 5 (starts in 0)
* </pre><p>
* By default is the last digit -1 (= getDigitCount - 1)
*/
public int getDv1Position(){
if (getDvCount() == 1){
return defaultDigitCount() - 1;
} else {
return defaultDigitCount() - 2;
}
}
/**Returns the value of the fisrt check digit
* @return the value of the fisrt check digit
*/
public short getDv1Value(){
return getDigitValue(getDv1Position());
}
/**<pre>
* 12345-67
* ^
* This is the Second Check Digit (Dv2)
* Check Digite = 7
* Position = 6 (starts in 0)
* </pre><p>
* By default is the last digit (= getDigitCount)
* @return The Second Check Digit Position
*/
public int getDv2Position(){
return defaultDigitCount() - 1;
}
/**Returns the value of the second check digit
* @return the value of the second check digit
*/
public short getDv2Value(){
return getDigitValue(getDv2Position());
}
/**The count of check digits
* @return The number of chek digits
*/
public abstract int getDvCount();
/**Returns the IE mask
* @return The IE mask
*/
public abstract String getMask();
/**
* @see org.brazilutils.utilities.NumberComposed#getNumber()
*/
public String getNumber() {
return number.getNumber();
}
/**
* @return Returns the pesos.
*/
public Pesos getPesos() {
return pesos;
}
public abstract String getPesosList();
/**
* @see org.brazilutils.utilities.NumberComposed#getValue()
*/
public String getValue() {
return number.getValue();
}
/**Determines if the
* @return True if the number has the same count of digitCount
*/
public boolean isDigitCountCorrect(){
return defaultDigitCount() == getNumber().length();
}
/**
* @see org.brazilutils.validation.Validable#isValid()
*/
public abstract boolean isValid();
/**Sets the number of Inscricao Estadual
* @param number The number to set.
*/
public void setNumber(String number){
this.number.setNumber(number);
}
/**
* @see org.brazilutils.utilities.NumberComposed#toLong()
*/
public long toLong() {
return number.toLong();
}
/**
* @see java.lang.Object#toString()
*/
public String toString() {
return getValue();
}
/**
* @throws ValidationException
* @see org.brazilutils.br.uf.ie.AbstractInscricaoEstadual#validate()
*/
public void validate() throws ValidationException {
if ( !isValid() ) throw new ValidationException();
}
}
Classe de Inscrição Estadual do Acre que fiz para testar (funcionou):
/*
* Created on 10/04/2005
*/
package org.brazilutils.br.uf.ie;
/**
* @author Douglas Siviotti
*/
public class InscricaoEstadualAC extends AbstractInscricaoEstadual {
/**
* @see org.brazilutils.br.uf.ie.AbstractInscricaoEstadual#defaultDigitCount()
*/
public int defaultDigitCount() {
return 13;
}
/**
* @see org.brazilutils.br.uf.ie.AbstractInscricaoEstadual#getDvCount()
*/
public int getDvCount() {
return 2;
}
/**
* @see org.brazilutils.br.uf.ie.AbstractInscricaoEstadual#getMask()
*/
public String getMask() {
return "##.###.###/###-##";
}
/**
* @see org.brazilutils.br.uf.ie.AbstractInscricaoEstadual#getPesosList()
*/
public String getPesosList() {
return "[telefone removido]";
}
/**
* @see org.brazilutils.br.uf.ie.AbstractInscricaoEstadual#isValid()
*/
public boolean isValid() {
if (!isDigitCountCorrect()) return false;
int sum1 = applyPesos(0, 10, getPesos());
int mod1 = sum1 % MOD11;
int dif1 = MOD11 - mod1;
int dv1;
if (dif1 >= 10) dv1 = 0; else dv1 = dif1;
System.out.println(sum1 + " : 11 = " + mod1 + " - dif = " + dif1 + " - dv1 = " + dv1 );
int sum2 = applyPesos(0, 11, new Pesos("543298765432"));
int mod2 = sum2 % MOD11;
int dif2 = MOD11 - mod2;
int dv2;
if (dif2 >= 10) dv2 = 0; else dv2 = dif2;
System.out.println(sum2 + " : 11 = " + mod2 + " - dif = " + dif2 + " - dv1 = " + dv2 );
return getDv1Value() == dv1 && getDv2Value() == dv2;
}
}
Classe para fazer o teste:
public class TestUF {
public static void main(String[] args) {
UF uf = null;
try {
uf = new UF("AC");
} catch (UfException e) {
e.printStackTrace();
}
uf.getInscricaoEstadual().setNumber("[telefone removido]-12");
System.out.println(uf.getInscricaoEstadual().toString());
System.out.println("isValid() = " + uf.getInscricaoEstadual().isValid());
System.out.println(uf.getAbbreviature());
System.out.println(uf.getName());
}
}
Só uma observação. Algumas inscrições estaduais tem peculiaridades.
O mato grosso por exemplo, pode ter 9, 10 ou 11 dígitos (Isso não é falado no site).
Eu tenho um código aqui de cálculo de Inscrição Estadual de uns 8 estados, que não posso postar (apesar de eu mesmo ter feito).
Esse é o código em C que fizemos em uma dll separada da aplicação aqui que é em VB.
Vou retirar alguns comentários, mudar alguns nomes de variáveis e posto aqui novamente (quem sabe animo em converter pra Java). :lol:
Só uma observação. Algumas inscrições estaduais tem peculiaridades.
O mato grosso por exemplo, pode ter 9, 10 ou 11 dígitos (Isso não é falado no site).
Eu tenho um código aqui de cálculo de Inscrição Estadual de uns 8 estados, que não posso postar (apesar de eu mesmo ter feito).Esse é o código em C que fizemos em uma dll separada da aplicação aqui que é em VB.
Vou retirar alguns comentários, mudar alguns nomes de variáveis e posto aqui novamente (quem sabe animo em converter pra Java). :lol:
se não se animar eu faço … ja faço isso o dia inteiro …
vou mudar minha assinatura para:
Tradutor juramentado C++ -> Java. …
Só uma observação. Algumas inscrições estaduais tem peculiaridades.
O mato grosso por exemplo, pode ter 9, 10 ou 11 dígitos (Isso não é falado no site).
Eu tenho um código aqui de cálculo de Inscrição Estadual de uns 8 estados, que não posso postar (apesar de eu mesmo ter feito).Esse é o código em C que fizemos em uma dll separada da aplicação aqui que é em VB.
Vou retirar alguns comentários, mudar alguns nomes de variáveis e posto aqui novamente (quem sabe animo em converter pra Java). :lol:
se não se animar eu faço … ja faço isso o dia inteiro …
vou mudar minha assinatura para:
Tradutor juramentado C++ -> Java. …
Se eu não animar te passo por email então. :thumbup:
dsviotti, pq nao usar JUnit pra testar, ao inves da psvm?
Só uma observação. Algumas inscrições estaduais tem peculiaridades.
O mato grosso por exemplo, pode ter 9, 10 ou 11 dígitos (Isso não é falado no site).
Eu sei. Dei uma olhada em todos os estados no site do sintegra. A pior é de São paulo, tem 2 tipos, um dos dífgitos fica no meio do número :shock: e um dos tipos tem um P. Mas os métodos na superclasse servem bem a mais 90% dos estados. No caso de MT e SP é só fazer um override de alguns. No de Sp, pro exemplo, teria que fazer um override de getDv1Potision() que retorna count -1 ou count-2, ele teria que retornar 9 ou 9 calculado.
Cv, não usei o Junit por preguiça 8) mesmo. Não estou acostumado com JUnit mas vou aceitar a sugestão e refazer os testes enquanto são poucos. Valeu. 
Pessoal,
Os códigos de validações de Inscrições Estaduais já está pronto (rodando). O problema é que eu só tenho Inscrições Estaduais de São Paulo e Rio. O pessoal dos demais estados pode dar uma grande ajuda simplesmente me enviando algumas Inscrições Estaduais válidas. Melhor ainda seria testar a classe de IE do seu estado. O código já está lá no java.net, acho que o Fernando (Scottys0) já colocou inclusive no CVS.
Pequeno código para quem puder testar as classes:
package org.brazilutils.test;
import junit.framework.TestCase;
import org.brazilutils.br.uf.UF;
import org.brazilutils.br.uf.UfException;
public class UFTest2 extends TestCase {
public void test() throws Exception {
UF uf = null;
try {
uf = new UF("SP");//Cria a UF a partir da Sigla
} catch (UfException e) {
e.printStackTrace();
}
uf.getInscricaoEstadual().setNumber("110.042.490.114");
assertTrue(uf.getInscricaoEstadual().isValid());
}
}
o código já está no cvs do java.net
ps. o teste para o paraná está ok
90175758-53
PR
Paraná
Sum:160 Mod:6 Dif:5 Dv:5
Sum:206 Mod:8 Dif:3 Dv:3
A todos que forem audar a codificar !
Sempre façam o download da ultima versão do source do CVS !
aqui tem um tutorial que ensina como integrar o cvs ao eclipse.
http://www.jelb.org.br/~filipe/java/cvs-eclipse/index.html
Ultimo add, um Build.xml para geração da api em .jar e geração da documentação também em um jar
onde está configurado assim, podendo ser alterada 
:arrow: brazilutils.$(version).jar - brazilutils.0.0.1.jar
:arrow: brazilutils.doc.$(version).jar - brazilutils.doc.0.0.1.jar
Galerinha, me diz uma coisa… toh vendo os fontes no CVS e vi um negocio q não gostei.
Como faz? Muda e comita?
A classe BrKit tem o contrutor privado e um get que não é estático :S Mui esquisito…
O contrutor deveria receber o estado como parâmetro, não ficava melhor…
Sei lá, deixa um estado X como default é só coisa pra dar confusão!!! 6 num axam?
Posso mudar e comitar?
VELO
Outra coisa, java 1.4 ou java 5?
VELO
Outra coisa, java 1.4 ou java 5?
VELO
Java 1.5
Outra coisa, java 1.4 ou java 5?
VELOJava 1.5
Show…
Mas como preenche isso?
Issue number:
Obtained from:
Submitted by:
Reviewed by:
CVS: ----------------------------------------------------------------------
CVS: Issue number:
CVS: If this change addresses one or more issues,
CVS: then enter the issue number(s) here.
CVS: Obtained from:
CVS: If this change has been taken from another system,
CVS: then name the system in this line, otherwise delete it.
CVS: Submitted by:
CVS: If this code has been contributed to the project by someone else; i.e.,
CVS: they sent us a patch or a set of diffs, then include their name/email
CVS: address here. If this is your work then delete this line.
CVS: Reviewed by:
CVS: If we are doing pre-commit code reviews and someone else has
CVS: reviewed your changes, include their name(s) here.
CVS: If you have not had it reviewed then delete this line.
Velo, Tiger rulezzz!Jah tah no 3ºupdate, jah não dah para ignorá-lo! 
Fernando, tô com o mesmo problema do velo… dah para rolar um howto?..heheh
Pessoal,
Vou fazrt um acerto na IE de SP por que esqueci de fazer a o segundo tipo possível de IE, para produtores rurais.
Quanto ao CVS tb estou dando umas cabeçadas, mas usando o eclipse ficou bem simples. Como vocês podem perceber já tem um monte de versões antigas pq eu e o Fernando fizemos uns testes e eu, pessoalmente, apanhei um pouco.
Volto a pedir para o pessoal de outros estados (fora Rio e SP) me enviarem números válidos de inscrição estadual e se possível dar uma testada no código. Obrigado…
A classe BrKit tem o contrutor privado e um get que não é estático :S Mui esquisito…O contrutor deveria receber o estado como parâmetro, não ficava melhor…
Sei lá, deixa um estado X como default é só coisa pra dar confusão!!! 6 num axam?
Posso mudar e comitar?
VELO
Esa classe é aquela que será tipo um canivete suiço da API. Assim, será uma das últimas a ficar prontas. Só coloquei ela lá pra lembrar que ela existe. Pode alterar o que estiver errado e adicionar mais funcionalidades se quiser.
Esa classe é aquela que será tipo um canivete suiço da API. Assim, será uma das últimas a ficar prontas. Só coloquei ela lá pra lembrar que ela existe. Pode alterar o que estiver errado e adicionar mais funcionalidades se quiser.
Hoje ela tem um problema… é impossível obter uma instancia da classe

VELO
Eu sou tosco e vou xingar um monte, mas por favor tomem um prozac e levem isso de forma construtiva enquanto ainda eh tempo, ou esse projeto vai ser um desastre.
Broncas:
:arrow: Cade os testes unitarios isolados?
:arrow: Cade os testes unitarios integrados?
:arrow: Cade os testes funcionais?
:arrow: Pq o build.xml nao roda nenhum dos acima?
:arrow: Cade o relatorio de test coverage? Voces podem usar o Emma (http://emma.sourceforge.net/), que eh gratis. 
:arrow: Singletons. Por favor, dsiviotti e scottys0, nem tentem se explicar por essa. Simplesmente apaguem essa BrKit de la, tentem de novo, e finjam que nao aconteceu nada. Voces tambem podem pedir desculpas, mas eh melhor todo mundo fazer vista grossa, e assim voces evitam a humilhacao de ter que admitir que uma classe como aquela um dia passou pela cabeca.
:arrow: A documentacao e a API metade em ingles e metade em portugues da arrepios. Facam tudo em portugues, logo duma vez, por favoooooooooor!
:arrow: As mensagens de commit no CVS nao dizem nada que va ajudar alguem como eu, que esta so passeando pelo codigo, a entender o que esta acontecendo - usem mensagens mais descritivas, please!
:arrow: Varias packages vazias, ou com codigo pela metade. Se voce nao tem codigo pra mostrar, nao mande pro CVS - assim fica bem mais facil gerenciar arquivos deletados, tags, branches etc e tal.
:arrow: EXPRESSOES REGULARES PELO AMOR DE DEUS! Voces parecem que gostam de sofrer fazendo substring! Gente, tenham doh, expressoes regulares entraram no Java na 1.4 e ja existem faz mais de 20 anos, se voces ainda nao aprenderam, tomem vergonha na cara!
:arrow: Se o codigo eh LGPL, faltou colocar um LICENSE na raiz do projeto, e idealmente, todo arquivo tem que incluir aquele bloquinho maldito explicando a licenca.
:arrow: Os construtores das classes Cnpj, Cpf e tantas outras estao duplicando codigo a toa. E lancar excecoes no construtor eh rude com os pobres usuarios da sua API 
:arrow: Eu ja mencionei expressoes regulares?
:arrow: Pra que serve a interface Endereco? Declarar um monte de getter e setter? Que sao duplicados depois na EnderecoAdapter :?
:arrow: TipoLogradouro deveria ser uma enum, nao uma classe - afinal, vcs estao usando Java 1.5…
:arrow: Eu ja mencionei que “Represents the DDD of a Telefone” realmente nao ajuda quem nao fala portugues, e quase faz o pessoal que fala mijar de rir?
:arrow: Expressoes regulares? :mrgreen:
:arrow: Digam oi pro dsiviotti! Eh o que tem na TODO :mrgreen:
- cv, enfiando o peh na maior e mais fedida jaca de todos os tempos
Olá!
As colocações do CV são sem dúvida ótimas!
Estou ainda por fora do que está acontecendo, mas lendo o que o Carlos escreveu, vi que vcs estão usando Ant!
Vcs teriam ainda que configurar o Ant para rodar todos os teste unitários, e testes em geral! O ideal é que durante o desenvolvimento o teste acontecesse várias vezes!
Para facilitar a vida do BrazilUtils, acho que seria melhor usarmos Maven! Além de não ser difícil usá-lo, você não se preocupa em ficar criando tantas configurações na unha igual é no ant!
se vc for no pronpt do comando, ou via um plugins no Eclipse, vc conseguirá rodar todos os testes sempre que quiser, usando o comando tes!
Outra coisa interessante é a geração da documentação! O Maven quebraria um galho e tanto!
Olha aqui um guiazinho!
http://hotwork.sourceforge.net/hotwork/manual/maven/maven-user-guide.html
Em breve posso ver isso para vocês, só que esta semana pra mim vai ser aquela correria. Se você não se importarem de esperar um pouquinho, blz!
Abraços!
Thiago
Maven nao vai resolver o problema, Thiago. O codigo continua ruim, e build automatizado de codigo ruim continua sendo um build automatizado de codigo ruim. Por enquanto, o que tem da pra compilar no Eclipse, mesmo, e o Ant fica so pra rodar builds de vez em quando, e empacotar os JARs. Pra isso, o Ant ja ta maaaaaaais do que suficiente, e nao tem aquela aberracao do Jelly que o Maven usa pra manter.
Cv, desde que comecei a usar o fórum do GUJ, as suas respostas sempre foram algumas das que mais levo em consideração. Por isso, vou aceitar o seu conselho e levar isso de forma construtiva. Aliás, alguns posts atrás neste tópico você vai ver que o Fábio Patrício perguntou se tinha algum Arquiteto ou Gerente do projeto e nós dissemos que não. Vou considerar seu post como um aceite para o cargo extra-oficial de Manager-Escrachator do projeto. Bem vindo.
Quanto às suas colocações, vamos lá…
Quanto aos testes: alguns posts atrás você me sugeriu que usasse Junit ao invés de psvm. Eu, modestamente, tentei seguir seu conselho e fiz uma “classezinha” extendento TestCase. Gostei bastante e vou acertar os outros assim como fazer o que está pendente. Não conheço o Emma, vou dar uma olhada.
Singleton: BrKit. Foi uma sugestão do início do projeto, o Ironlinx já tinha sugerido que isso seria uma grande centralizador sem necessidade. Ela estva lá abandonada, como o velo falou, nem dá pra instanciar. Já apaguei e vou fingir que nada aconteceu.
Com relação a Documentação: Neste ponto não posso tomar decisão sozinho. A questão da documentação foi definida na reunião do projeto e acho que devemos discutir novamente para mudar. Por enquanto estou fazendo como combinamos. Bem antes, eu tinha dito que isso dependeria do rumo que tudo tomasse, da forma como está, acho que o melhor realmente é fazer em português.
CVS: Como já dissemos, o Fernando (scottys0) colocou o código lá como teste. Ele cismou que ia fazer e fez, assim como o canal IRC que ficou muito bacana. Legal, desse tipo de iniciativa é que estamos precisando. Ontem pela manhã eu nunca havia usado um CVS, depois que ele colocou o código lá estou desvendando como funciona o CVS no Eclipse. Vou conversar com ele sobre as mensagens.
Packages vazias ou Código pela metade: Aqui comigo não existe nenhum pacote vazio. Deve ser por causa to teste que falei. Os códigos pela metade são, por exemplo, a Classe de Cpf cujo único método vazio é o de validação. Deixei vazio por que é o “filé” da classe. Alguém que não está participando poderia se interessar e querer implementar (quem quiser, por favor).
Expressões Regulares: outra dica que pretendo aceitar. Conheço expressões regulares de “olhada” e não estava querendo parar o que estava fazendo para estudar. Agora que está rodando, pelo menos, posso me aprofundar.
LGPL: Vou colocar o bloquinho nos arquivos. Qual o link para o texto padrão?
Constructor Duplicados e com Exceções: Para coisas como CEP, CPF, CNPF, UF etc existe sempre uma classe simples que pode-se fazer
Coisa coisa = new CoisaAdapter();
coisa.setCoisa(“Coisinha”);
e outras que são do tipo ValidCoisa. Onde se faz
Coisa coisa = new ValidCoisa(“Coisinha”); // gera ValidatinException
No primeiro tipo existe um constructor simples na segunda o constructor garante que você não instancia um CPF se ele não for válido. Ou seja, isValid() é sempre true.
Isso foi só uma idéia, não sei se terá utilidade mas achei interessante implementar dessa forma. Se é inútil eu não sei, gostaria de opiniões. Os duplicados existem por uma questão de conforto de quem está criando a classe, pode passar como String ou como int.
Interface Endereço e afins: Essas interfaces tem tudo a ver com os dois tipos de classe acima. Coisa coisa = new CoisaAdapter ou Coisa coisa = new ValidCoisa. Mas, realmente, no caso de Endereço, Telefone e talvez p Cep não seja necessário. A do Telefone já retirei.
TipoLogradouro – No início do tópico o Grivon fez uma Classe para Logradouro com um início de normalização. Eu escrevi um código só pra dar a ele uma estrutura já próxima com o que estávamos fazendo. Até criei uma TipoLogradouroNormalizer mas não sei como será a implementação disso. Não queria atropelar o código que ele estava fazendo. Foi só uma idéia. Quanto a lista de valores, sim, posso fazer como enum. Ainda estou usando o Eclipse 3.0.1, mas pretendo começar a usar o 1.5 em breve.
“Represents the DDD of a Telefone”: como já disse acima, talvez devamos rever a questão da documentação. Por isso não dediquei muito tempo ao javadoc. . Aliás ao longo da discussão surgiram algumas dúvidas de como seria o nome da classe Logradouro em inglês etc. Isso inclui o DDD, DDI e a parte do número que sobra. Realmente não conheço as palavras em inglês para melhor definir as partes do telefone. Por isso, inclusive, as classes se chamam DDD, DDI e Base! Gostaria realmente de uma sugestão melhor que isso.
Acho que é isso. Valeu pelas “broncas”. :lol:
Sim, vou estudar Expressões regulares. 
Galera do projeto, vejam aqui meu MSN [email removido]
Mesmo eu me contradizendo e me ridicularizando o tempo todo? Uau :mrgreen:
Gostei da descricao do cargo :mrgreen:
Vou poder colocar isso no meu cartao de visita?
Carlos Villela
Escrachator-In-Chief
GUJ, Inc
[email removido]
Cv, suas críticas são válidas e bem-vindas. :thumbup:
Não haverá API meio-a-meio… deverá ser tudo em Inglês, mantendo nomes comuns em português(como siglas).
O aportuguesamento do projeto beneficiaria a parte br, mas depois o que faríamos com métricas e outras?Cavalos-a -vapor?Traduziria Newton também???O q envolver detalhes, explicaremos melhor(mesmo em inglês…) Simples. e validateCPF() não seria algo difícil de compreender…não?Quanto ao DDD eu sei q ficou brabo…
E tah meia-boca agora, não lançaremos um release assim…
O pessoal tava reclamando muito de código, foi postado para dar uma idéia(ou incentivo) para o pessoal.Não para usar em “produção”.
Mas realmente está na hora de darmos um rumo ao caos.
E então Cv, vc vai ficar aí sentado na janela ou vai expor a bunda com a gente? 
Clica na opção de “PM” lah na página do projeto… 
Grinvon, eu te adicionei no ICQ e ateh agora vc não me autorizou! :?
Usamos muito mais icq do q msn…
Antes que o cv volte a falar das tais regular expressions, vou facilitar um pouco a vida…
aqui tem uma boa parte das que vocês precisam. Só por favor, não reinventem a roda. 
Ah, é fácil adaptar as RegEx pra Java, não é só dar copy paste, mas uma consulta rápida à API resolve tudo…
Ironlynx, te perguntei no ICQ sobre o código de barras e você nem respondeu
Conseguiu implementar o I25? É só dele que vai precisar? (note que estou apenas sendo curioso e intrometido, não tô ajudando em nada).
Ah e já estou como “observer” (é pelo andar da carruagem vai ser só isso mesmo
) no Java.net.
Tava reparando no tamanho não só do tópico em si, mas dos posts… que tal fazer um livro? “BrazilUtils - A Bíblia” (com voz roca do Cid Moreira)…
Renato, foi malzz… eu nem peguei nesse aspecto ainda.O rafael(outro membro do projeto) ia tentar fazer.Se ele não conseguir eu faço. 
Renato, se vc perceber, esse tópico oferece uma visão para todos aqueles que pretendem fazer um projetinho OS de como ele é.E, como pode ver, não é fácil quanto parece…
Relaxa Ironlynx, só tô brincando, só brincando…
@+ e não foi malz não, eu só sou um intrometido!!! Era só curiosidade mesmo, já que estávamos falando disso outro dia.
E, você fez uma aparição relâmpago no ICQ, nem consegui responder!! Como você não leu o artigo todo, não deve saber que existe uma classe pronta para pintar o I25. Aliás muito bom o artigo, conseguir entender, e conseguir entender uma coisa após ler um artigo é um mérito não tão comum como deveria. Parabéns ao cara que nem sei quem é…
Meu projetinho OS não me parece tão complicado… E, bem, a idéia do BrazilUtils me parece de um projeto relativamente grande
Eu sou tosco e vou xingar um monte, mas por favor tomem um prozac e levem isso de forma construtiva enquanto ainda eh tempo, ou esse projeto vai ser um desastre.Broncas:
.
.
.
- cv, enfiando o peh na maior e mais fedida jaca de todos os tempos
Esse foi uns dos posts mais engraçados que eu já vi aqui! Isso que eu chamo de CRÍTICA construtiva!
hehehe
E eu tinha esperanca na humanidade… :roll:
Não haverá API meio-a-meio… deverá ser tudo em Inglês, mantendo nomes comuns em português(como siglas).
O aportuguesamento do projeto beneficiaria a parte br, mas depois o que faríamos com métricas e outras?Cavalos-a -vapor?Traduziria Newton também???O q envolver detalhes, explicaremos melhor(mesmo em inglês…) Simples. e validateCPF() não seria algo difícil de compreender…não?Quanto ao DDD eu sei q ficou brabo…
Ou seja, vc esta me dizendo que nao vai fazer nada sobre coisas como “Returns the DDD of a Telefone”? OK, eu pelo menos tentei evitar que um monte de usuarios da sua API perdesse o emprego pq teve uma crise de riso enquanto programava :mrgreen:
E tah meia-boca agora, não lançaremos um release assim…
O pessoal tava reclamando muito de código, foi postado para dar uma idéia(ou incentivo) para o pessoal.Não para usar em “produção”.
Mas realmente está na hora de darmos um rumo ao caos.
Foi, uhhh… mais ou menos isso que eu tentei incentivar voces a fazer 
E então Cv, vc vai ficar aí sentado na janela ou vai expor a bunda com a gente?
Clica na opção de “PM” lah na página do projeto…![]()
Foi mal, gente, mas eu tou com muito pouco tempo pra poder ajudar voces do jeito que eu queria. Melhor ficar na bronca ocasional aqui no forum, mesmo, e assim eu nao me comprometo a fazer nada que eu nao posso.
E, bom, eu nao sei uma forma menos rude de dizer isso, mas da minha bunda cuido eu :mrgreen:
- cv, cuidando da propria bunda e tirando ela da reta
Sanduiche-iche? :lol: :lol:
Bom, cv, quando quiser a casa estará aberta. 
Jah temos 12 membros no projeto e um bom PM(Principalmente veterano de guerra) nos faz falta.Não seria alguem que necessariamente fosse codificar(jah são 6 os devs mas quem coda mais eh o Douglas q eh owner), mas alguem que pudesse alertar de erros antes mesmos que eles acontececem(Existe alguem assim???huahauha…).Pois afinal, números por extenso, cpf, rg… somos nós reescrevendo a roda, e botando uns aros de magnésio nela, para que ninguem tenha q fazê-lo. 
Ou seja, vc esta me dizendo que nao vai fazer nada sobre coisas como “Returns the DDD of a Telefone”? OK, eu pelo menos tentei evitar que um monte de usuarios da sua API perdesse o emprego pq teve uma crise de riso enquanto programava :mrgreen:
Sanduiche-iche? :lol: :lol:
Nossa, nao me faz eu lembrar dessa mulher. :lol:
Lóóóóóógico
Um item da lista do CV eu “matei” …
Buildfile: /home/scottys0/workspace/brazilutils/build.xml
compile:
test:
[junit] Running org.brazilutils.test.UFTest
[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.498 sec
[junit] Testsuite: org.brazilutils.test.UFTest
[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.498 sec
[junit] ------------- Standard Output ---------------
[junit] 90175758-53
[junit] PR
[junit] Paraná
[junit] Sum:160 Mod:6 Dif:5 Dv:5
[junit] Sum:206 Mod:8 Dif:3 Dv:3
[junit] ------------- ---------------- ---------------
[junit] Testcase: test took 0.498 sec
BUILD SUCCESSFUL
Total time: 5 seconds
DICA O projeto está usando Jdk 1.5, aproveite a especificação da linguagem e use oque ela oferece … ex.
ANTES
for (int i; i < TIPOS.length(); i++) {
boolean b = list.add(TIPOS[i]);
}
DEPOIS
for ( String str : TIPOS) {
boolean b = list.add(TIPOS);
}
só pegando no pé …
Isso Fernando!
Pessoal, meu Eclipse tah chiando com Generics, alguem jah teve algo parecido?Eu uso o 3.1M6.
apaga teu projeto local e baixa a ultima versão do cvs, o projeto tava configurado para aceitar somente java 1.4
// Editado
… agora vi q nao subiu .project pro cvs :s
chegando em casa vou arrumar
Pessoal, refiz a classe TipoLogradouro. Fiz como enum e implementei a normalização usando Expressões Regulares. Ainda não está no CVS mas segue o código para críticas e sugestões.
public enum TipoLogradouro {
Aeroporto(""),
Alameda(""),
Área(""),
Avenida("Av", "AV.*"),
Campo(""),
Chácara(""),
Colônia(""),
Condomínio("Cond", "COND.*"),
Conjunto(""),
Distrito(""),
Esplanada(""),
Estação("Esta", "ESTA.*"),
Estrada("Estr", "ESTR.*"),
Favela(""),
Fazenda(""),
Feira(""),
Jardim(""),
Ladeira(""),
Lago(""),
Lagoa(""),
Largo(""),
Loteamento(""),
Morro(""),
Núcleo(""),
Parque(""),
Passarela(""),
Pátio(""),
Praça(""),
Quadra("Q", "Q.*"),
Recanto(""),
Residencial(""),
Rodovia("Rod", "ROD.*"),
Rua("R", "RU.*"),
Setor(""),
Sítio(""),
Travessa("Trav", "TRA.*"),
Trecho(""),
Trevo(""),
Vale(""),
Vereda(""),
Via(""),
Viaduto(""),
Viela(""),
Vila("");
/**
* @param tipo
* @return
*/
public static TipoLogradouro create(String tipo){
String upper = tipo.toUpperCase();
// Try match the Name
for (TipoLogradouro t: EnumSet.range
(TipoLogradouro.Aeroporto, TipoLogradouro.Vila)){
String s = t.name().toUpperCase();
if (upper.equals(s)) return t;
}
// Try match the Abbreviature
for (TipoLogradouro t: EnumSet.range
(TipoLogradouro.Aeroporto, TipoLogradouro.Vila)){
String a = t.getAbbreviature().toUpperCase().toString();
if (upper.equals(a)) return t;
}
return null;
}
/**
* @param tipo
* @return
*/
public static boolean isValid(String tipo){
String upper = tipo.toUpperCase();
for (TipoLogradouro t: EnumSet.range
(TipoLogradouro.Aeroporto, TipoLogradouro.Vila)){
String s = t.name().toUpperCase();
if (upper.equals(s)) return true;
}
return false;
}
/**
* @param tipo
* @return
*/
public static String normalize(String tipo){
String result = null;
for (TipoLogradouro t: EnumSet.range
(TipoLogradouro.Aeroporto, TipoLogradouro.Vila)){
result = t.doNormalize(tipo);
if (result != null) return result;
}
return null;
}
private String abbreviature;
private String regex = null;
/**
* @param abbreviature Abbreviature
* @param names Possible names
*/
private TipoLogradouro(String abbreviature, String ... args){
this.abbreviature = abbreviature;
if (args.length > 0) {
regex = args[0];
}
}
/**
* @param tipo
* @return
*/
public String doNormalize(String tipo){
String upper = tipo.toUpperCase();
String result = null;
if (regex != null) {
if (upper.matches(regex)) return name();
}
return result;
}
/**
* @return The Abbreviature
*/
public String getAbbreviature() {
return abbreviature;
}
}
Douglas, aih so tem o codigo… cade o teste, pra gente poder saber se ele funciona ou nao, e o que ele faz, sem ter que ler/entender?
Fiz um simples:
package org.brazilutils.test;
import org.brazilutils.br.endereco.Logradouro;
import org.brazilutils.br.endereco.TipoLogradouro;
import junit.framework.TestCase;
public class LogradouroTest extends TestCase {
public void test1() throws Exception {
Logradouro l = new Logradouro();
l.setLogradouro("Avenida Teste"); // valid
assertTrue(l.isValid());
}
public void test2() throws Exception {
Logradouro l = new Logradouro();
l.setLogradouro("Nonono Teste"); // invalid
assertTrue(!l.isValid());
}
public void test3() throws Exception {
Logradouro l = new Logradouro();
l.setLogradouro("Rua"); // invalid
assertTrue(!l.isValid());
}
public void test4() throws Exception {
Logradouro l = new Logradouro();
l.setLogradouro("Avenida Teste");
// tipo = Avenida
// Nome = Teste
String av = TipoLogradouro.Avenida.toString();
assertTrue( l.getTipo().equals(av) &&
l.getNome().equals("Teste") );
}
public void test5() throws Exception {
Logradouro l = new Logradouro();
l.setLogradouro("Aven Teste");
// Aven -> Avenida
l.normalize();
String av = TipoLogradouro.Avenida.toString();
assertTrue( l.getTipo().equals(av)); //Avenida
l.setLogradouro("Estr. Teste");
// Estr -> Estrada
l.normalize();
String estrada = TipoLogradouro.Estrada.toString();
assertTrue( l.getTipo().equals(estrada)); //Estrada
}
}
E lá se vai um programador e começa a surgir um gerente de projetos :XD:
Ironlynx…
Boa Douglas!!!Eu tb vou me acostumar a testar…
Beleza Renato, mas se não fosse pedir muito, vc tem a lógica disso?
A do 2 por 5 tem no guj, se não tiver depois eu procuro no google mesmo.Valeu! :thumbup:
Valeu Renato!Só agora vi suas PM!!!
Vou dar uma boa lida naquilo e repassar ao Rafael! :thumbup:
Os fontes tão aqui, mas infelizmente em Delphi, não em Java (humm… é… humm… :roll: )
Pessoal, após instalar o Eclipse M6 e começar a usar as novas funcionalidades do 5.0 eu tô igual criança com brinquedo novo. Depois que refiz a classe TipoLogradouro como enum percebi que poderia fazer o mesmo para as Unidades da federação (UF). Antes eu tinha 27 classes (uma por uf) mais umas 3 ou 4 (interfaces etc). Troquei TODAS por uma única classe UF que é um enum com todas as mesmas propriedades das antigas. A nova é bem mais elegante para criaço~, pois não precisa gerar exceções por que só é possível criar umas das 27 possibilidades do enum, ou null.
Estou fazendo uma tb para os formatos do telefone e pensei se seria possível fazer para Inscrição Estadual, que também são 27 classes. Essas últimas acho que não é possível pois cada uma tem um método de validação diferente. No caso da UF o que muda á só sigla, nome e IE. Se alguém tiver uma idéia de como fazer uma redução semelhante nas Inscrições Estaduais eu agradeço.
Segue a classe nova de UF:
package org.brazilutils.br.endereco;
import java.util.EnumSet;
import org.brazilutils.br.ie.AbstractInscricaoEstadual;
import org.brazilutils.br.ie.InscricaoEstadualAC;
import org.brazilutils.br.ie.InscricaoEstadualAL;
import org.brazilutils.br.ie.InscricaoEstadualAM;
import org.brazilutils.br.ie.InscricaoEstadualAP;
import org.brazilutils.br.ie.InscricaoEstadualBA;
import org.brazilutils.br.ie.InscricaoEstadualCE;
import org.brazilutils.br.ie.InscricaoEstadualDF;
import org.brazilutils.br.ie.InscricaoEstadualES;
import org.brazilutils.br.ie.InscricaoEstadualGO;
import org.brazilutils.br.ie.InscricaoEstadualMA;
import org.brazilutils.br.ie.InscricaoEstadualMG;
import org.brazilutils.br.ie.InscricaoEstadualMS;
import org.brazilutils.br.ie.InscricaoEstadualMT;
import org.brazilutils.br.ie.InscricaoEstadualPA;
import org.brazilutils.br.ie.InscricaoEstadualPB;
import org.brazilutils.br.ie.InscricaoEstadualPE;
import org.brazilutils.br.ie.InscricaoEstadualPI;
import org.brazilutils.br.ie.InscricaoEstadualPR;
import org.brazilutils.br.ie.InscricaoEstadualRJ;
import org.brazilutils.br.ie.InscricaoEstadualRN;
import org.brazilutils.br.ie.InscricaoEstadualRO;
import org.brazilutils.br.ie.InscricaoEstadualRR;
import org.brazilutils.br.ie.InscricaoEstadualRS;
import org.brazilutils.br.ie.InscricaoEstadualSC;
import org.brazilutils.br.ie.InscricaoEstadualSE;
import org.brazilutils.br.ie.InscricaoEstadualSP;
import org.brazilutils.br.ie.InscricaoEstadualTO;
/**
* @author Douglas Siviotti
*
*/
public enum UF {
AC("Acre", new InscricaoEstadualAC()),
AL("Alagoas", new InscricaoEstadualAL()),
AM("Amazonas", new InscricaoEstadualAM()),
AP("Amapá", new InscricaoEstadualAP()),
BA("Bahia", new InscricaoEstadualBA()),
CE("Ceará", new InscricaoEstadualCE()),
DF("Distrito Federal", new InscricaoEstadualDF()),
ES("ESpírito Santo", new InscricaoEstadualES()),
GO("Goiás", new InscricaoEstadualGO()),
MA("Maranhão", new InscricaoEstadualMA()),
MG("Minas Gerais", new InscricaoEstadualMG()),
MS("Mato Grosso do Sul", new InscricaoEstadualMS()),
MT("Mato Grosso", new InscricaoEstadualMT()),
PA("Pará", new InscricaoEstadualPA()),
PB("Paraíba", new InscricaoEstadualPB()),
PE("Pernambuco", new InscricaoEstadualPE()),
PI("Piauí", new InscricaoEstadualPI()),
PR("Paraná", new InscricaoEstadualPR()),
RJ("Rio de Janeiro", new InscricaoEstadualRJ()),
RN("Rio Grande do Norte", new InscricaoEstadualRN()),
RO("Rondônia", new InscricaoEstadualRO()),
RR("Roraima", new InscricaoEstadualRR()),
RS("Rio Grande do Sul", new InscricaoEstadualRS()),
SC("Santa Catarina", new InscricaoEstadualSC()),
SE("Sergipe", new InscricaoEstadualSE()),
SP("São Paulo", new InscricaoEstadualSP()),
TO("Tocantins", new InscricaoEstadualTO())
;
/**Create a UF from a String.
* @param uf The UF abbreviature as String
* @return The Uf
*/
public static UF getUf(String uf){
String upper = uf.toUpperCase();
for (UF u: EnumSet.range
(UF.AC, UF.TO)){
String s = u.name().toUpperCase();
if (upper.equals(s)) return u;
}
return null;
}
// PRIVATE
private AbstractInscricaoEstadual inscricaoEstadual;
private String ufName;
private UF(String ufName, AbstractInscricaoEstadual ie){
this.ufName = ufName;
this.inscricaoEstadual = ie;
}
// PUBLIC
/**
* @return Returns the inscricaoEstadual.
*/
public AbstractInscricaoEstadual getInscricaoEstadual() {
return inscricaoEstadual;
}
/**
* @return Returns the Uf Name.
*/
public String getName() {
return ufName;
}
/**Returns the abbreviature. Returns name() method value.
* @return Returns the abbreviature.
*/
public String getAbbreviature(){
return name();
}
}
Aliás, matei o pacote UF e coloquei ela no pacote endereco junto com o CEp que tinha ficado sozinho no pacote. Vou escrever uns testes amanhã e dou retorno.
WTF! :shock:
Caramba!!!Nunca usei essa feature do Tiger!!!
Isso parece aquelas estruturas em C…
Parece poupar um bando de constantes em interface tb, mas qual é o custo disso???
Cadê o nosso PM Web?(CeeeeVêeee!!!)
Me lembra o BD em Haskell…
“Parece aquelas estruturas em C” - nao parecem, SAO as enums do C, soh que com umas frescurinhas a mais 
Nao se preocupe com o custo - elas sao soh classes, no fim das contas (passe um javap numa enum pra ver exatamente o que acontece, ou leia a spec ;))
Pessoal. Estou pensando em renomear o pacote cpfcnpj para id para colocar ali classes de identidade, Pis e coisas assim. O que vocês acham, devo renomear o cpfcnpj e por tudo junto ou criar um pacote id novo?
Aproveitando… Fiz uma verificação de CEP a partir da UF com base nas regiões definidas pelo Correio. Se você tem um cep e uma UF dá pra saber se aquele cep pode ou não estar em um determinado estado. Segue a classe de teste:
package org.brazilutils.test;
import org.brazilutils.br.endereco.Cep;
import org.brazilutils.br.endereco.UF;
import junit.framework.TestCase;
public class CepUfTest extends TestCase {
/**CEP and UF check
* @throws Exception
*/
public void test3() throws Exception{
Cep cepSP1 = new Cep("01.234.567"); // SP
Cep cepSP2 = new Cep("11.234-567"); // SP
Cep cepRJ = new Cep("21.021-380"); // RJ
Cep cepRS = new Cep("91.021-380"); // RS
UF rj = UF.RJ; // first digit 2
UF sp = UF.SP; // first digit 0|1
UF rs = UF.RS; // first digit 9
// RJ
assertTrue(rj.cepMatches(cepSP1.toString()) == false);
assertTrue(rj.cepMatches(cepSP2.toString()) == false);
assertTrue(rj.cepMatches(cepRJ.toString()) == true);
assertTrue(rj.cepMatches(cepRS.toString()) == false);
// SP
assertTrue(sp.cepMatches(cepSP1.toString()) == true);
assertTrue(sp.cepMatches(cepSP2.toString()) == true);
assertTrue(sp.cepMatches(cepRJ.toString()) == false);
assertTrue(sp.cepMatches(cepRS.toString()) == false);
// RS
assertTrue(rs.cepMatches(cepSP1.toString()) == false);
assertTrue(rs.cepMatches(cepSP2.toString()) == false);
assertTrue(rs.cepMatches(cepRJ.toString()) == false);
assertTrue(rs.cepMatches(cepRS.toString()) == true);
}
}
Amanhã vou colocar o código no cvs, mas quem quiser tem aquele zip lá na página do projeto.
dsiviotti, test3() eh um nome de metodo ruim - ele nao diz o que vc ta testando… mais pra frente, num relatorio do JUnit, “3” nao vai te dizer nada sobre o teste que falhou 
Que tal testCEPAceitaNumerosDeCEPValidosEmSP(), testCEPAceitaNumerosDeCEPValidosNoRJ(), testCEPAceitaNumerosDeCEPValidosNoRS(), e por ai vai?
Alias, pq assertTrue(… == true) e assertTrue(… == false) e nao assertTrue(…) e assertFalse(…) direto? 
Alias, pq assertTrue(… == true) e assertTrue(… == false) e nao assertTrue(…) e assertFalse(…) direto? ;)
Falou cv, nem sabia da existência do assertFalse(), tava usando true e false na comparação pra ficar mais legível, mas assertTrue/assertFalse fica melhor.
Já está corrigido.
public class CepUfTest extends TestCase {
/**CEP and UF check
* @throws Exception
*/
public void testUfValidaCep() throws Exception{
Cep cepSP1 = new Cep("01.234.567"); // SP
Cep cepSP2 = new Cep("11.234-567"); // SP
Cep cepRJ = new Cep("21.021-380"); // RJ
Cep cepRS = new Cep("91.021-380"); // RS
UF rj = UF.RJ; // first digit 2
UF sp = UF.SP; // first digit 0|1
UF rs = UF.RS; // first digit 9
// RJ
assertFalse(rj.cepMatches(cepSP1.toString()));
assertFalse(rj.cepMatches(cepSP2.toString()));
assertTrue(rj.cepMatches(cepRJ.toString()));
assertFalse(rj.cepMatches(cepRS.toString()));
// SP
assertTrue(sp.cepMatches(cepSP1.toString()));
assertTrue(sp.cepMatches(cepSP2.toString()));
assertFalse(sp.cepMatches(cepRJ.toString()));
assertFalse(sp.cepMatches(cepRS.toString()));
// RS
assertFalse(rs.cepMatches(cepSP1.toString()));
assertFalse(rs.cepMatches(cepSP2.toString()));
assertFalse(rs.cepMatches(cepRJ.toString()));
assertTrue(rs.cepMatches(cepRS.toString()));
}
}
Vou acertar os outros. Você memcionou testeCep…Rj, testCep…SP, acha necessário fazer um para cada UF? O mecanismo é basicamente o mesmo para todas usei 3 pra verificar se funcionava. O que muda é uma String passada como parâmetro para cada estado, ele testa o primeiro (os primeiros no futuro) caracteres e copara com esse parâmetro. Fazer 27 testes vai ser cruel.
Dei uma refinada na relação Cep/Uf. Agora um CEp sabe a qual Uf pertence através do método getUf() é possível determinar a UF de um CEP.
Cep cep = new Cep("21.021-380");
System.out.println(cep.getUf()); // a saída é RJ
Com isso dá pra validar um cep em um endereço que tenha uf.
Nos casos de AM, DF e GO as faixas não são contínuas, mas mesmo nestes já dá pra identificar a uf.
public void testAmDfGoRange() throws Exception{
// AM = 69000000 to 69299999 and 69400000 to 69899999
Cep cepAM1 = new Cep("69.295-625"); // AM
Cep cepAM2 = new Cep("69.355-625"); // RR !!!
Cep cepAM3 = new Cep("69.455-625"); // AM
Cep cepAM4 = new Cep("69.955-625"); // AC !!!
assertTrue(cepAM1.getUf().equals(UF.AM));
assertFalse(cepAM2.getUf().equals(UF.AM));
assertTrue(cepAM2.getUf().equals(UF.RR));
assertTrue(cepAM3.getUf().equals(UF.AM));
assertFalse(cepAM4.getUf().equals(UF.AM));
assertTrue(cepAM4.getUf().equals(UF.AC));
// DF = 70000000 to 72799999 and 73000000 to 73699999
// GO = 72800000 to 72999999 and 73700000 to 76799999
Cep cepDF1 = new Cep("70.321.375");
Cep cepDF2 = new Cep("73.621.375");
Cep cepGO1 = new Cep("72.821.375");
Cep cepGO2 = new Cep("73.721.375");
assertTrue(cepDF1.getUf().equals(UF.DF));
assertTrue(cepDF2.getUf().equals(UF.DF));
assertTrue(cepGO1.getUf().equals(UF.GO));
assertTrue(cepGO2.getUf().equals(UF.GO));
}
Também estou com um probleminha.No meu caso,em relação ao pack metrics…
Tenho muitos métodos burros, do tipo:
public BigDecimal convertAtmToPsi(double atm){
BigDecimal result = new BigDecimal(atm*14.6959643206788);
return result;
}
O que acaba gerando classes com mais de 1000linhas…
Para ficar mais enxuto eu pensei em algo do tipo:
public BigDecimal convertToPsi(double value,int scale){
for...
if(i==scale){
PSI_CONSTANT=PSI_CONST[i];
}
BigDecimal result = new BigDecimal(value * PSI_CONSTANT);
return result;
}
Onde scale seria o num de casas decimais.
assim, a única classe inchada seria uma interface “carregada” de constantes referentes a diferentes casas decimais.Sugestões???
Não tenho certeza se entendi o problema. Coloca um zip lá na página do projeto (não no CVS) e eu dou uma olhada.
ironlynx, esse lance das constantes eh legal, mas eh detalhe de implementacao e nao deve ser exposto na API publica - o melhor seria ter, por exemplo, ATM.toPSI() e PSI.toATM(). Dica: BigDecimal nao eh final, voce pode estender 
Pessoal,
Acabei criando um pacote novo “id” e deixei o cpfcnpj como está. No pacote id terá as classes RG (Identidade), CNH(Habilitação), CTPS (Carteira Profissional), TítuloEleitoral, Placa (de carro) PisPasep e o que mais surgir desse tipo. Essas classes não tem obrigatoriamente validação, mas em geral sõ compostas por várias partes, assim acho que ficão bem juntas.
Sobre as placas de carro o enum UF já reconhece uma placa de carro sendo de uma ou outra UF através das três letras da placa. Segue a classe de teste:
package org.brazilutils.test;
import junit.framework.TestCase;
import org.brazilutils.br.endereco.UF;
import org.brazilutils.br.id.Placa;
public class TestPlaca extends TestCase {
/**test formats
* @throws Exception
*/
public void testPlaca() throws Exception {
Placa placa = new Placa("ABC-1234");
assertTrue(placa.toString().equals("ABC-1234"));
placa.setPlaca("LLL4321");
assertTrue(placa.toString().equals("LLL-4321"));
placa.setLetters("mmm"); // lower
placa.setNumbers("5555");
assertTrue(placa.toString().equals("MMM-5555"));
}
/**Test UF
* @throws Exception
*/
public void testPlacaUf() throws Exception {
Placa placa = new Placa("ABC-1234"); // PR
assertTrue(placa.getUf().equals(UF.PR));
placa.setPlaca("LLL-2143"); // RJ
assertTrue(placa.getUf().equals(UF.RJ));
placa.setPlaca("ZZZ-2211"); // invalid - out of range
assertTrue(placa.getUf() == null);
placa.setPlaca("BEZ-1234"); // LAST PR
assertTrue(placa.getUf().equals(UF.PR));
placa.setPlaca("BFA-1234"); // FIRST SP
assertTrue(placa.getUf().equals(UF.SP));
}
}
Não sei se tem grande utilidade mas como era igual ao CEP achei que devia implementar. As classes que citei antes do pacote ID estão só na estrutura, se alguém tiver algo já pronto ou alguma idéia será bem-vinda.
Cv, eu isolei por unidades físicas(Energy,Pressure,Force…), senão eu teria incontáveis classes…(centenas, ou mais…) por isso eu deixei o convertToItem…deixando em cada classe, suas unidades correspondentes.
Acho q não pesquei o lance do BigDecimal.Vc tah querendo dizer para eu flexibilizar para extender qdo necessário???(Dê exemplos…)
Tô procurando na API, mas não tô achando… tem algum método para eu pegar só a quantidade passada de dígitos depois da vírgula?
Boa Douglas!!!
EDITADO:Tava procurando em biginteger não ia achar mesmo… hauhauha
É só usar o setScale()! 
Mas Cv, explane melhor a sua idéia…
Parece que o problema do número de linhas poderia ser resolvido desmembrando a classe Energy mesmo. Energy passa a ser um pacote e BTU, Cal, Erg etc viram classes desse pacote. Fica melhor para dar manutenção. Ao invés de Energy.convertBtuToCal() seria BTU.toCal(). Não sei se alcancei o problema mas acho dessa forma mais simplificado.
Ainda não tinha idéia do tamanho do pacote metrics, agora vejo que ele vai crescer bastante.
Opa pessoal…
Duas coisas:
-
Tem alguma classe responsável por converter números romanos em números de verdade? Senão, onde posso criar?
-
O que que há com o CVS? Baxei e tá com erro de compilação, alguem sabe?
VELO
Vou acertar o CVS hoje. Houve alteração em alguns pacotes por isso o erro.
Quanto aos números romanos, acho que pode ser no pacote orb.brazilutils.metrics, mas confirma com o Ironlynx porque ele está mechendo nesse pacote.
Vou fazer no meu PC local…
Depois eu comito quando decidirem!
VELO
Mas Cv, explane melhor a sua idéia...
O que vc nao entendeu?
public class MililitrosPorMenstruacao extends BigDecimal {
// ...
public LigacoesTelefonicasPorTPM toLigacoesTelefonicasPorTPM() {
return // faca a conversao aqui
}
}
Desse jeito, MililitrosPorMenstruacao continua se comportando como um BigDecimal, mas que "faz sentido" como numero, e nao eh soh um monte de algarismo jogado um na frente do outro... se eh que uma medida chamada 'mililitros por menstruacao' faz algum sentido...
Velo, taí algo que eu não posso te precisar 100%.Não conheço nenhuma métrica em romanos(deve haver).Temporariariamente podedia deixar em org.brazilutils.utilities.conversion por exemplo, pois não deixa de ser uma utilidade.Vou pesquisar sobre isso.
Cv, saquei sua idéia.Mas ainda acho mais fácil separar por assunto(como é físicamente viável), e para obedecer o SI(Sistema Internacional), fazendo uma classe para cada conj de unidades de medidas, e mantendo uma interface principal com todas as constantes.Algo + ou -:
public class Pressure implements NumericConstant{
public BigDecimal convertAtmToPsi(double atm,int decimalPlace){
BigDecimal result = new BigDecimal(atm * PSI);
result= result.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
return result;
}
//blabalbal...
}
Mas se o povo prefere por cada tipo de conversão numa classe, farei assim(Vai ficar populado…).Vou substituir então o que seria uma classe de unidades afins por um package, o que pensando bem, não deixa de ficar claro tb.
Velo, taí algo que eu não posso te precisar 100%.Não conheço nenhuma métrica em romanos(deve haver).Temporariariamente podedia deixar em org.brazilutils.utilities.conversion por exemplo, pois não deixa de ser uma utilidade.Vou pesquisar sobre isso.
Blz…
Eu jah fiz a conversão de int para romano, mas o teto, por enquanto, é o numero 3999, para numeros maiores preciso de uns caracteres especiais que não se como fazer em java… V com tracinho em cima, tipo um assento. Se alguem sober o caractere pra isso, ajuda.
VELO
Dei uma atualizada no CVS. Mudei alguns pacotes e criei i pacote ID que está com as classes paraticamente vazias ainda. Os outros já estão funcionando e com testes rodando.
Comitei toda a parte de números romanos.....
Pra quem tiver preguiça de ir no CVS, tá aí o fonte.
VELO
/*
* Created on 26/05/2005
*/
package org.brazilutils.utilities.conversion;
/**
* @author Marvin Herman Froeder
*/
public final class RomanNumbers {
private static RomanNumbers instance;
private RomanNumbers() {
}
public String IntToRoman(int value) {
String roman = "";
if (value == 0)
return "";
if (value < 0)
throw new IllegalArgumentException(
"Impossivel criar numero romano menor que 0.");
if (value <= 3999) {
while (value / 1000 >= 1) {
roman += "M";
value = value - 1000;
}
if (value / 900 >= 1) {
roman += "CM";
value = value - 900;
}
if (value / 500 >= 1) {
roman += "D";
value = value - 500;
}
if (value / 400 >= 1) {
roman += "CD";
value = value - 400;
}
while (value / 100 >= 1) {
roman += "C";
value = value - 100;
}
if (value / 90 >= 1) {
roman += "XC";
value = value - 90;
}
if (value / 50 >= 1) {
roman += "L";
value = value - 50;
}
if (value / 40 >= 1) {
roman += "XL";
value = value - 40;
}
while (value / 10 >= 1) {
roman += "X";
value = value - 10;
}
if (value / 9 >= 1) {
roman += "IX";
value = value - 9;
}
if (value / 5 >= 1) {
roman += "V";
value = value - 5;
}
if (value / 4 >= 1) {
roman += "IV";
value = value - 4;
}
while (value >= 1) {
roman += "I";
value = value - 1;
}
return roman;
} else {
throw new IllegalArgumentException(
"Impossivel criar numero romano maior que 3999.");
}
}
/**
* @return Returns the instance.
*/
public static RomanNumbers getInstance() {
if (instance == null)
instance = new RomanNumbers();
return instance;
}
public int RomanToInt(String roman) {
if (this.validate(roman)) {
char[] chars = roman.toCharArray();
char lastChar = ' ';
int value = 0;
for (int i = chars.length - 1; i >= 0; i--) {
switch (chars[i]) {
case 'I':
if (lastChar == 'X' || lastChar == 'V')
value -= 1;
else
value += 1;
break;
case 'V':
value += 5;
break;
case 'X':
if (lastChar == 'C' || lastChar == 'L')
value -= 10;
else
value += 10;
break;
case 'L':
value += 50;
break;
case 'C':
if (lastChar == 'M' || lastChar == 'D')
value -= 100;
else
value += 100;
break;
case 'D':
value += 500;
break;
case 'M':
value += 1000;
break;
}
lastChar = chars[i];
}
return value;
} else
throw new IllegalArgumentException("Numero recebido inválido!");
}
public boolean validate(String roman) {
char[] chars = roman.toCharArray();
char lastChar;
for (int i = 0; i < chars.length; i++) {
if (Character.isLowerCase(chars[i]))
return false;
if (chars[i] != 'I' && chars[i] != 'V' && chars[i] != 'X'
&& chars[i] != 'L' && chars[i] != 'C' && chars[i] != 'D'
&& chars[i] != 'M')
return false;
}
return true;
}
}
Blz Velo!!! 
Mas temos que começar a pegar o costume de fazer com pelo menos um teste adicionado.Ateh eu tô tendo que me acostumar com isso…mas no final te livre de problemas mil…
Péééééééééééééé. Resposta errada, Ironlynx. Voces tem que fazer as coisas COMECANDO PELO TESTE DANDO ERRADO, de preferencia com um erro de compilacao do tipo “a classe que voce esta tentando testar nem existe ainda, maneh!”, e trabalhando sempre em cima do teste e da implementacao ate que o codigo saia. Nao vou enumerar os beneficios disso, mas TDD vale a pena, vai por mim 
O que é um teste adicionado???
Não entendi esse final, hheheheh
VELO
O que é um teste adicionado???
Não entendi esse final, hheheheh
VELO
Hm…ele quiz dizer adicione ao menos um teste no cvs junto com a implementacao. Mas eu concordo com o CV, faca o teste primeiro para todas funfionalidades, com eles em maos implemente as funcionalidades. Quando os testes nao derem mais erro podem commitar.
]['s
Cv, quando eu crescer eu quero ser q nem vc! 
Agora, isso de começar pelo teste antes mesmo de fazer o programa para mim é quase uma quebra de paradigma. :shock:
Vc testa antes mesmo de modelar???
Para testar antes(tah certo, JUNTO) da implementação, em teoria, o cara tem que SABER testar antes mesmo de PROGRAMAR.Isso é complicado…
Vou ter q me adaptar a isso… 8)
Velo, só tava me referindo a uma classe q testasse alguma das features que vc escreveu(para assim sabermos o que a classe está fazendo).
Uhm… entendi… eu fiz um teste unitário pra ela sim, testando erros e acertos, só há um erro não testado… quando os algarismos romanos estão fora de ordem ele ignora o problema… tirando isso, tá 100%
VELO
Velo, só tava me referindo a uma classe q testasse alguma das features que vc escreveu(para assim sabermos o que a classe está fazendo).
Ai que ta, testes de unidade nao podem ser feitos em cima de alguma funcionalidade, mas sim em cima de TODAS funcionalidades da classe. Porque os testes nao servem so para saber o que a classe faz, mas tambem pra saber se realmente ela ta fazendo o que se espera.
Ai que ta, testes de unidade nao podem ser feitos em cima de alguma funcionalidade, mas sim em cima de TODAS funcionalidades da classe. Porque os testes nao servem so para saber o que a classe faz, mas tambem pra saber se realmente ela ta fazendo o que se espera.
Fábio, nisso eu concordo, mas teremos muitas classes com métodos burros, que darão um trabalhão devido a quantidade de features(como a classe metrics), e não devido a alguma complexidade em termos de programação.São centenas de métodos q basicamente pegam um parâmetro e multiplicam por uma constante.Neste caso, por exemplo, basta pegar alguns para fazer uma amostragem.Ateh pq se eu cometesse um erro no valor de uma constante física, o teste não seria capaz de me dizer isso(pois nesse caso,não saberia q teria errado …).
Qual a licença do projeto?
No java.net fala em LGPL… no CVS fala na licença da apache… o q tah valendo?
VELO
Entao nao tenha metodos burros, ora essa. Escreva codigo que faz sentido e prove alguma funcionalidade que nao seja “burra”, que nao seja “obvia”. De codigo e programador burro o mundo ja ta cheio, pra que contribuir? 
Cv, eu chamo de método burro aquele q não faz muita coisa, ou o mínimo indispensável para realizar uma tarefa simples e repetitiva.Receber um parâmetro e multiplicá-lo por uma constante para mim é uma dessas tarefas.Se eu pegar uma constante errada e passar para o teste, ele não pode validá-la se ele não conhece a correta…
Nesse projeto faremos coisas justamente para “poupar saco” dos programadores, que jah perdem muito tempo com deploys, configuraçoes de banco e servidores.O trabalho q fazemos é sujo.Mas é um mal necessário.Códigos de validação de CPF/CNPJ/RG/ não são nem um pouco inteligentes e intuitivos(aliás, esse excesso de registros não é algo muito inteligente, mas se fosse simplificado e centralizado, seria mais difícil roubarem nosso dinheirinho…)
Assumindo que vc se refere ao lance de converter medidas, cara, tem dezenas de jeitos mais legais de fazer isso do que um metodo do tipo convert(value, to, from) - e eu ja dei uma ideia aqui de como fazer, estendendo BigDecimal e tal. E, quanto aos testes, um pouquinho de inventividade resolve. Precisa testar a conversao de litros pra pints? Asserte que o seu codigo esta gerando o mesmo valor que o Google:
http://www.google.com/search?hl=pt-BR&q=4+uk+pints+in+liters&btnG=Pesquisar&lr=
Assim, voce nao usa a constante errada no teste, e ele te indica se voce fez besteira ou nao.
Entao, poupe ainda mais o saco dos programadores e nao faca eles terem que depurar a sua lib um dia desses pq ela foi mal testada ou mal desenhada… teste tudo que puder, e o que voce nao puder nao deveria estar ali em primeiro lugar. Simples assim: se alguma coisa nao pode ou “nao vale a pena” ser testada, eh pq ela nao deveria estar ali, e tem que haver um jeito melhor de desenhar aquela funcionalidade de forma que ela possa ser testada de forma independente e que traga seguranca de que sua implementacao foi, de fato, correta.
Eh uma restricao de design simples, e que pode parecer meio absurda, mas experimente com ela um pouco e vc vai ver como a coisa anda. Lembrando sempre que a lei do “quanto menos codigo, melhor” tambem vale pros testes - se os seus testes estao muito longos, repetitivos ou estao testando muita coisa de cada vez, quebre-os em pedacos menores e mais faceis de digerir.
Podem nao ser, mas nao existe razao pra que o codigo que faz essa validacao nao seja, e quanto ao seu dinheiro, ele vai ser roubado enquanto existir corrupcao e desonestidade no Brasil (e eu vejo coisas como a situacao tributaria atual extremamente desonesta), e nao pq a maioria dos brasileiros tem 3 documentos de identidade diferentes. 
Ok, chefe.Sugestão acatada.
Qto a conversão eu jah uso o link q vc pôs de conversões há tempos, mas há outro q uso mais intuitivo e científico.
Eu não tô falando do código só que eu irei digitar, mas para o programador, convertToATM(double N,int scale) é claro não é?(Eu me preocupo com o usuário!)
Corrupção existe e existirá em qualquer país do mundo, pois o corrupto é um parasita(1) mutualista,por vezes simbiótico, que cria colônias com muita facilidade.Só existe o corrupto por que existe o corrompido.Ninguém está livre dessa.E sim Cv, a existência de vários documentos descentralizados é a melhor forma de propagar a corrupção que mama nas tetas do erário.Dificulta o cruzamento de dados.Se centralizar, ficaria muuuuuito mais difícil.
NOTA: (1)-Minha própria definição de ser humano em matéria de sua relação para com o meio.
Sinceramente, nao. convert O QUE pra ATM? Um ‘int scale’? Ahh… erhm… :?
Qual o problema com:
Bar bar = new Bar("100");
Atm atm = bar.toAtm();
Hein? Hein? 
Cv, tópicos atrás vc viu q eu estava fazendo convertATMtoBar(double atm), blalbla dentro de uma classe de unidade física afim(Pressão,Energia…).
Da forma que vc fez(via construtor), tb não ajuda muito, pois poderá me retornar um número de 20 dígitos na casa decimal, o que pode ser desnecessário para muitos.Por isso a escala. 
E eu não tenho problemas com CONSTRUTORES!!! :?
No fundo eu fazia assim:
public class Energy implements Energizable{
BigDecimal convertWattToJoule(double watt)
//retorna um parâmetro muuuito grande
BigDecimal convertWattToJoule(double watt,int scale)
//retorna com o num de casas que o usuário quer
}
onde Energizable é a interface com as constantes!
Cara, não seria interessante eu permitir q se faça uma inportação estática da classe para depois fazer só uma chamada do método q eu pretendo utilizar na minha classe?(Igual aos métodos da classe Math)
E eu vou mudar o nome das interfaces…(antes q reclame!)
Eu não tenho nada contra construtores, mas vc gastou 2 linhas para algo q poderia se restringir a uma chamada de método!(Tah, eu sei q otimização prematura é a raiz do mal…)
Quem deveria se preocupar com a precisão do número é o usuário, não?
Pelo menos no mundo real é assim, as calculadoras retornam números com muitas casas decimais e quem tá fazendo a conta é quem faz o arredondamento, seguindo alguns critérios de algarismos significativos. (Outra coisa que poderia ser implementada)
Exatamente - otimizacao prematura, nesse caso, ta jogando fora a legibilidade e expressividade do seu codigo. Compare:
Pint p = new Litre("0.568261485").toPint();
assertEquals(1, p.intValue());
Versus:
int p = Volume.convertLitreToPint(0.568261485);
assertEquals(1, p);
No primeiro trecho, a pergunta “o que eh ‘p’?” eh respondida com MUITO mais facilidade, e a conversao pelo metodo toPint() eh bem obvia - voce sabe que esta convertendo um valor do tipo Litre pra outro valor do tipo Pint. O compilador pega as bobeadas pra voce, e desse jeito fica simplesmente impossivel fazer cagadas do tipo:
int width = getWidthInInches();
int pints = Volume.convertLitreToPint(width);
Tendo isto em mente, vejamos de novo a sua afirmacao:
“Por isso a escala o que”, cara palida? Voce esta confundindo a logica de representacao (e eh pra ela que temos DecimalFormat) com os dados, em si. Distorcer o ultimo pra favorecer o primeiro so tem uma consequencia: merda.
Na minha sugestao, isso nem sequer entra em questao - ja que Pint e Litre sao filhas de BigDecimal, e essa ja tem um construtor bacana que pega a escala - e que, se eu entendi direito, nao eh a mesma escala de que vc esta falando. Fica faltando escrever uma classe que estenda DecimalFormat, e apresente as coisas de uma maneira bonitinha.
6 taum ligado data em java…
Um classe é a data, outra faz matemática com a data e outra serve pra imprimir a data…
Não chega a ser uma abordagem de todo ruim, ou chega?
VELO
Cv, agora eu realmente saquei o q vc disse!(UFA! :lol: )
damn…mais uma vez os testes!Ahhhh!!!Por isso não visualizava o q vc queria dizer!
É esse mesmo!Só que com o ROUND_HALF_UP!!
setScale(decimalPlace,BigDecimal.ROUND_HALF_UP);
Esqueci da herança… :roll:
Esuqce DecimalFormat.Deixe ele para currency.Da forma q vc mostrou jah tah beem claro!
Velo, foi mal não responder antes(os tópicos estão big…)!A licença é LGPL, tb conhecida como PEF(Pegue-E-F!), não vejo pq os projetos serem tão frescos com esse lance de licenças…
Velo, o smota tinha dado umas idéias interessantes para Data, e acho q o Fernando(Scottys) tinha pensado em algo tb, mas não temos nada estruturado no assunto!Se a DATA for algo tão crucial, criaremos um pack para ela, e subdividimos por requisito/necessidade como vc falou.
Na verdade eu tava fazendo uma analogia a como o java trata a data com o q o CV tava falando…
VELO
Mudando um pouco o assunto… eu fiz uma classe para validação de título eleitoral. Copiei certinho de uma função que tinha em delphi, mas algo não está dando certo. Suspeito que seja a diferença do início dos vetores que em delphi iniciam em 1 (geranmente) bem como o primeiro caractere das strings. Isso pq o dígito que deveria dar 88 dá 87. Pode ser só coencidência ou não. Se alguém puder testar com o seupróprio Tílulo seria bom um feedback. Vou postar só o método de validação:
public static boolean isValid(String tituloEleitoral){
if (tituloEleitoral == null) return false;
String n = tituloEleitoral.replaceAll("[^0-9]*","");
if (n.length() != DIGIT_COUNT) return false;
int i; // just count
int[] coeficients = {10,9,8,7,6,5,4,3,2,4,3}; // Coeficients
int digit; // A number digit
int sum; // The sum of (Digit * Coeficient)
int foundDv=0; // The found Dv (Chek Digit)
int aux = Integer.parseInt(""+n.charAt(9)+n.charAt(10));
int dv = Integer.parseInt(""+n.charAt(11)+n.charAt(12));
sum = 0;
for (i = 0; i < DIGIT_COUNT - 2 /*-2 Digits*/; i++){
digit = Integer.parseInt(String.valueOf(n.charAt(i)));
sum += digit * coeficients[i];
if ( i >= 8 && i <= 10){ // Pos 8, 9 and 10
sum = sum % 11;
if (sum > 1){
sum = 11 - sum;
} else {
if (aux <= 2)
sum = 1 - sum;
else
sum = 0;
} // if (sum > 1){
if (i == 8)
foundDv = sum * 10;
else
foundDv = foundDv + sum;
sum = sum * 2;
}
}
System.out.println("Dv:" + dv + " FoundDV:" + foundDv );
return dv == foundDv;
}
Onde esta o TestCase?
Rafael
Pra postar o testcase todo teria que colocar a classe tb. O probleme definitivamente está neste método. Veja que no final ele mostra o dv e o dv calculado. Se não é igual ali nem adiante tentar ver o test case. O método é que está dando pau.
EDITADO:
Já resolvi, na função em Delphi tinha um
if i in [9,11]
isso significa se for 9 OU 11 eu coloquei como sendo ENTRE 9 e 11 !!! :x
Opa, conforme colocado na lista, vou fazer a classe que coloca a data por extenso blz?
Com dia da semana, dia do mes, mês e ano por extenso. Tá bom?
Só confirma e eu saio codando…
Abraço
Opa, conforme colocado na lista, vou fazer a classe que coloca a data por extenso blz?
Com dia da semana, dia do mes, mês e ano por extenso. Tá bom?Só confirma e eu saio codando…
Abraço
É toda sua. Por enquanto coloque no pacote org.brazilutils.utilities.
Bom, voces podem simplesmente mandar o link para o arquivo no cvs 
Rafael
Pessoal, boa parte das classes do pacote br eram números com alguma máscara. Assim elas implementavam uma interface NumberComposed. Andei dando uma enxugada no código e percebi que da forma como está essa interface só ocupa espaço. A única função dela era padronizar os métodos de saída de valor(getValue() e getNumber()). exemplo:
Cep cep = new Cep();
cep.setCep("12.345-567");
System.out.println(cep.getValue()); // retorna "12.345-678"
System.out.println(cep.getNumber()); // retorna "12345678"
CpfCnpj cpfCnpj = new CpfCnpj();
cpfCnpj.setCfpCnpj("[CPF removido]");
System.out.println(cpfCnpj.getValue()); // retorna "[CPF removido]"
System.out.println(cpfCnpj.getNumber()); // retorna "[telefone removido]"
A questão é: para dar entrada o método é setCoisa() e para saída é getNumber() e getValue(), estava pensando em detonar de vez a Interface NumberComposed e trocar getValue() por getCoisa() (retorno formatado) e trocar getNumber() por getCoisaNoMask() / getRawCoisa() / getCoisaUnformatted() / getCoisaDigits() ou algo assim.
O que me sugerem?
getNumber e getValor tah londe de ser uma coisa intuitiva…
VELO
Tem planejado alguma coisa pra incluir uma classe que calcule area e volume de objetos geometricos? Ou o java tem isso de série?
VELO
getNumber e getValor tah londe de ser uma coisa intuitiva…
VELO
Pois é, estava pensando em usar getCoisa() no lugar de getValue(), mas como chamo o método que retorna só os dígitos sem formatação?
Quanto ás áreas e volumes acho que existe uma API pronta.
getNumber e getValor tah londe de ser uma coisa intuitiva…
VELOPois é, estava pensando em usar getCoisa() no lugar de getValue(), mas como chamo o método que retorna só os dígitos sem formatação?
getCoisaFormatada + getCoisa?
getNumber e getValor tah londe de ser uma coisa intuitiva…
VELOPois é, estava pensando em usar getCoisa() no lugar de getValue(), mas como chamo o método que retorna só os dígitos sem formatação?
getCoisaFormatada + getCoisa?
É em portugues ou ingles?
getCoisa ou buscaCoisa?
Ta ficando estranho. E o que é essa tal de coisa?
]['s
Coisa é um nome genérico para as classes do pacote br. Exemplo:
Cep cep = new Cep();
cep.setCep("12.345-567");
System.out.println(cep.getValue()); // retorna "12.345-678"
System.out.println(cep.getNumber()); // retorna "12345678"
CpfCnpj cpfCnpj = new CpfCnpj();
cpfCnpj.setCfpCnpj("[CPF removido]");
System.out.println(cpfCnpj.getValue()); // retorna "[CPF removido]"
System.out.println(cpfCnpj.getNumber()); // retorna "[telefone removido]"
Cep e CpfCnpj são a “coisa”.
o getCoisa() deve retornar a coisa formatada, com os pontos e traços, mas gostaria de sugestões para o getCoisaSemFormatacao(), estou pensando em simplesmente getDigits().
Pessoal, sei que se usa as classes de teste como parte importante da documentação do fonte. Gostaria de saber o que deve ser colocado nos javadocs das classes de teste.
Pensei em colocar os objetivos dos métodos de teste enumerados. O que mais se pode por nas classes de teste para ajudar na documentação?
Nao coloque nada - o nome do teste deve ser suficiente pra indicar o que ele faz, e as assercoes devem ser claras o bastante pra documentacao ser o proprio codigo. 
Fala Iron… estou na área…
aguardando a demanda… :lol:
Abs,
Mario Bros.
Duas coisas:
:arrow: Vou imprimir esse tópico inteiro pra aprender mais sobre desenvolvimento de software
:arrow: O JForum é bom pra CA(piiiiiiiiiiiiiiiiiii)

marcelo, so fuja do codigo do Ironlynx, a menos que vc queira aprender por exemplo reverso :mrgreen:
…
:arrow: Vou imprimir esse tópico inteiro pra aprender mais sobre desenvolvimento de software
Tem como imprimir tudo de uma vez ou c vai imprimir na mão página a página?
VELO
Sugestao? Abra o bom e velho processador de textos e escreva um artigo pro GUJ com as ideias que vc gostou daqui 
Puxa um dia tentei imprimir um tópico e ficou uma bela bosta, seria uma boa colocar uma feature no JForum tipo “versão para impressão”. Fica a sugestão, talvez estúpida.
Nada mesmo? Alguns testes têm mais de um método, não coloco nem um javadoc neles? Os nomes já estão dizendo o que fazem, mas ás vezes tem muitas assertions.
Se o codigo do teste nao tah obvio, eh um sinal de que o codigo de producao ta pior ainda, e um refactoring/redesign ta na hora. 
Nao se esqueca que os nomes dos metodos dos testes tem que ser bem explicativos tambem - test1() ou testCPFValidos() sao nomes pessimos. Tentem seguir esse formatinho:
testDeveQuando()
Exemplos:
testValidadorCpfDeveRejeitarCpfQuandoCpfForInvalido()
testValidadorCepDeveAceitarCepQuandoCepTiver10Digitos()
Não estou acompanhando o projeto, não li esta thread inteira, mas mesmo assim resolvi dar um palpite. Vejam se essa JSR nova tem alguma relação com o que vocês estão fazendo:
http://jcp.org/en/jsr/detail?id=275
Edição: Aparentemente esta JSR é relacionada com o projeto https://jscience.dev.java.net/, que já trata de aritmética com unidades.
Sim! 
Jah que tô vendo que o pessoal tah pegando pesado(íssimo) para cálculos de álgebra linear, economia e outros nesse jscience, vou me concentrar nas métricas brasileiras. 
rafael (glória), para te dar uma idéia na parte de números por extenso, veja esse link abaixo(o site todo é muuuito bom e rico em exemplos java):
Eu temporariamente “aboli” a parte de métricas internacionais, pois o jscience me parece muuuito bom(e beem mais completo do que eu tava fazendo).Vou me concentrar somente nas nossas.(Valeu pelo link Todo-Poderoso,vulgo Deus) 
rafael (glória), para te dar uma idéia na parte de números por extenso, veja esse link abaixo(o site todo é muuuito bom e rico em exemplos java):
Mas faz o favor de fazer isso internacionalizável…
.properties na véia 
VELO
import java.math.*;
public class Hectare extends BigDecimal implements Area {
private static final long serialVersionUID = 1L;
private BigDecimal value =null;
private Acre acreResult=null;
private double doubleValue;
public Hectare(){
super(0);
}
public Hectare(double value){
super(value);
}
public Hectare(String value) {
this(Double.valueOf(value).doubleValue());
}
public Acre convertToAcres(){
return new Acre(super.doubleValue()*ACRE);
}
public static void main(String[] args){
Acre a=new Hectare(10.0).convertToAcres();
System.out.println("O resultado: "+a.setScale(2,ROUND_HALF_UP));
}
}
public Hectare(double value,int scale,String round_mode){
super(value);
setScale(scale,round_mode);
}
Pessoal, vamos fazer uma "CHAMADA AOS CODERS" nesse fim de semana.Quero saber exatamente o que cada um tem, e o quanto foi implementado(ou não).
Sei la, Ironlynx, tanto faz po :XD:
O que eu estranhei mais foi aquele BigDecimal value ali… pra que serve?
Ok…vou manter a primeira forma.
Opa… estamos em julho, época da migração sazonal de variáveis… :mrgreen:
(Esqueci de deletar na hora do ctrl+C e crtl+V…)
Meu Caro Dart,
Não li todo topic, mas parabéns pela iniciativa!
Sem +!
Só uma questao sobre sua classe Hectare!! aqui em Rondonia temos os “Alqueires” (nao sei c vc ja implementou isso) e nao temos os “Acres”
1 Alqueire equivale a 2,42 Hectares!! (depois eu posso confirmar c tem mais precisao esse 2,42)!!
Valeu Beto! 
Fred, essa é a medida dos Alqueires Paulistas. O pessoal tem que se informar antes de usar qualquer um…antes de fazer esse projeto, eu nem sabia q tinha taaantos tipos assim… :mrgreen:
Talvez eu ponha um Leia-me para ajudar…
Dá uma olhada:
http://www.imoveisvirtuais.com.br/medidas.htm
http://txt.estado.com.br/redac/medidas.html
É, aqui: http://www.imoveisvirtuais.com.br/medidas.htm disseram que o alqueire do norte é 2,72 hectare, mas eu sou do norte (Rondonia) e aqui o alqueire é 2,42he (minha mãe tem um cartorio 8) ) pelo menos na minha região do estado é!!! e sobre hectare ainda tem os “centiares”
tipo 50,2343 cinquenta hectares, vite e tres ares e quarenta e tres centiares!!!
Pessoal, sobre a interface de matemática financeira, eu estou com uma dúvida:
Por exemplo, para calculos de juros simples é possivel usar o juros ao mes, ao ano, trimestre, etc… Como eu faço ? Um método com o tipo padrão ou vários métodos, um pra cada período ? Acho q a segunda opção eh meio inviável neh ?
Bom, aguardo sugestões, desculpe pelas duvida besta :mrgreen:
Pessoal, sobre a interface de matemática financeira, eu estou com uma dúvida:
Por exemplo, para calculos de juros simples é possivel usar o juros ao mes, ao ano, trimestre, etc… Como eu faço ? Um método com o tipo padrão ou vários métodos, um pra cada período ? Acho q a segunda opção eh meio inviável neh ?
Bom, aguardo sugestões, desculpe pelas duvida besta :mrgreen:
Eu faria um “setJuros” que recebe um double e um int…
public void setJutos(double valor, int perido){
//Codigo
}
Esse int pode sair de alguma interface que a tua classe implementa, sei lá, um IPeriodoJuros…
int DIARIO = 1;
int SEMANAL = 2;
....
Sei lá, eu faria assim, mas com certeza deve ter outras alternativas melhores…
VELO
Bom, a ideia foi boa, mas como quem vai usar saberia que 1 é semanal, 2 mensal, etc ?
public interface IPeriodoJuros{
int DIARIO = 1;
int SEMANAL = 2;
}
No javadoc do metodo setJuros você coloca a dica de onde pegar os número.
E a tua classe implementa essa interface, assim sendo ela tbm vai ter esses atributos.
VELO
Senhores,
Estou iniciando o uso do BrasilUtils neste minuto.
Devo passar ao pessoal aqui da empresa a forma de uso e os métodos que já estão implementados nele;
Vocês poderiam me informar como consigo o JavaDoc da API?
Grato
Acho que seria possível gerar o javadoc a partir dos próprios fontes.
Digite “javadoc” na linha de comando para obter a tela de ajuda e saber quais são os parâmetros necessários para se gerar o javadoc a partir dos fontes.
Velo, qt a parte dos juros achei melhor deixar de um jeito simples mesmo, até pq se a pessoa for fazer o calculo o padrão vai ser o mesmo tipo, se for um mes ou um dia nao vai fazer diferença se ele souber qual eh.
Ex:
para a formula J=Cin
onde J é o juros, C o capital, i a taxa e n o periodo
tendo em conta q a taxa é dada em porcentagem
public double getSimpleInterest(double C, double i, int n) {
double J;
i=( i / 100);
J=(C * i * n);
return this.J;
}
Portanto, pouco importa se é de 1 ano, 1 mes ou 1 semana.
Ou vc discorda ?
Velo, qt a parte dos juros achei melhor deixar de um jeito simples mesmo, até pq se a pessoa for fazer o calculo o padrão vai ser o mesmo tipo, se for um mes ou um dia nao vai fazer diferença se ele souber qual eh.
Ex:
para a formula J=Cin
onde J é o juros, C o capital, i a taxa e n o periodo
tendo em conta q a taxa é dada em porcentagempublic double getSimpleInterest(double C, double i, int n) { double J; i=( i / 100); J=(C * i * n); return this.J; }Portanto, pouco importa se é de 1 ano, 1 mes ou 1 semana.
Ou vc discorda ?
Ah, é tudo uma questão de gosto… no seu caso a pessoa q estiver usando a sua API vai ter de converter tudo para um mesmo “formato”…
Vc poderia fazer o metodo recebendo duas datas e calculando o período dentro, sabe, fica bacana… se pode sobrecarregar o teu metodo pra trabalhar de varias maneiras…
É um negócio meio neston, existem mil maneiras 
Eu sou da alternativa do quando mais melhor, ou seja, metodo sobrecarregado…
Quando vc publicar o codigo no cvs me dah um toque, eu pego em casa e dou um look.
VELO
Ví uma desvantagem da API…
pra quem já tem um projeto todo feito no Java 1.4(e não podemos mudar neste momento para 5), tem dificuldade de utilizar a API(se é que é possivel)…
Porque não foi feita a API em java 1.4(ou anterior) para maior compatibilidade?
Att,
Ví uma desvantagem da API…
pra quem já tem um projeto todo feito no Java 1.4(e não podemos mudar neste momento para 5), tem dificuldade de utilizar a API(se é que é possivel)…
Porque não foi feita a API em java 1.4(ou anterior) para maior compatibilidade?Att,
Qual parte exatamente você está usando?
Estou usando a parte de CPF e CNPJ… este codigo estava portavel, entao apenas retirei a logica…
espero que nao tenha corrompido nenhuma licença :mrgreen:
Existe algum método mais especifico para isso ou será q eh necessario fazer na mao mesmo ?
É o que eu ia te dizer. Existe uma Clase CpfCnpj mas tudo que você precisa é o método estático que recebe uma string e diz se é um Cpf ou Cnpj válido. Se você quer fazer uma simples validação isso já basta. A classe é boa se você for instanciar um objeto tipo Cliente/Funcionario etc que tenha um atributo CPF, CNPJ ou os dois em um.
Existe algum método mais especifico para isso ou será q eh necessario fazer na mao mesmo ?
Cara, te adicionei no msn…
Aparece on-line q a gente ve isso.
VELO
Parabéns pela iniciativa.
:thumbup:
Ví uma desvantagem da API…
pra quem já tem um projeto todo feito no Java 1.4(e não podemos mudar neste momento para 5), tem dificuldade de utilizar a API(se é que é possivel)…
Porque não foi feita a API em java 1.4(ou anterior) para maior compatibilidade?
Rafael, devemos incentivar o uso da nova, não o contrário…
claro que eu peço ao pessoal evitar o máximo o excesso de “guloseimas sintáticas”, mas se há novas features e otimização, pq não usá-las?
Opa, pessoal, fazendo uns testes bestas aqui, quando uso uma representação de um BigDecimal, exemplo:
package brazilutils.metrics.br;
import java.math.BigDecimal;
import java.math.BigInteger;
public class Gramas extends BigDecimal implements Peso {
/**
*
*/
private static final long serialVersionUID = 1L;
public Gramas(BigInteger arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public Gramas(double arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public Gramas(int arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public Gramas(long arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public Gramas(String arg0) {
super(arg0);
// TODO Auto-generated constructor stub
}
public Onca convertToOnca(){
return new Onca(super.doubleValue()/ONÇAS);
}
public OncasTroy convertToOncaTroy(){
return new OncasTroy(super.doubleValue()/ONÇAS_TROY);
}
}
Quando eu converter um número no “doubleValue()” poderá haver perda da precisão.O que vcs usam,ou melhor, o que é melhor usar,uma representação genérica(um toString da vida),ou deixo um construtor fazendo a manipulação direta de conversão?(It´s poor baby…)
Engraçado que essas dúvidas imbecis só aparecem quando vc começa a testar depois de ter escrito dezenas de classes… :roll:
Agora eu entendi o que o cv falava:“escreva o teste antes mesmo de escrever o código”… :?
E Thingol, jah rolou de fazer aquela classe básica de criptografia?
Terminando os testes(e corrigindo), eu termino essa parte essa semana.O douglas terminou a dele.O rafael termina logo tb.
Lucao, o que falta para vc?Por onde está o Daniel Gonçalves? :?:
Eu tenho uma base do correio que data do início deste ano… ainda está em MS Access, mas eu venho trabalhando na conversão pra MySQL e InterBase. É um cd só… se alguém tiver conta no GMail, posta aqui que eu envio… zipado dá uns 100 MB. Tá certo que precisa de um pouco de coragem pra baixar isso, mas tá na área é pra ser usado.
Qualquer coisa… só dê um toque que eu envio.
[email removido]
Na verdade falta a classe de RG (Identidade) e de CNH (Carteira de Habilitação). No caso do RG ainda estou procurando uma função real, pois ela não tem validação e tem um monte de tamanhos e órgãos emissores diferentes, ao contrtário de CPF, PIS etc. No caso dee CNH, Título Eleitoral e uma outrra que agora não me recordo só dá pra fazer validação do formato (número de dígitos e partes) mas acho que já ajuda. Para Placas de veículo ela já valida se a placa pertence a um ou outro estado (UF) e o formato.
Se alguém tiver notícia sobre como validar Carteira de Habilitação e/ou Carteira de Trabalho eu agradeço.
Douglas, vendo uma discussão lá no RioJug, eu fiquei pensando numa idéia que o Phillip Shoes deu, que foi a do BackLog de tarefas, ao invés de ficar tentando “angariar” a simpatia de quem pode fazer isso ou aquilo.
Ah, veja se vc consegue aí pelo rio essa revista(revista do CDROM 130):
http://www.europanet.com.br/euro2003/index.php?cat_id=4
Ela contém dados de 5507 municípios num BD, pode nos ser muito útil…
Aqui não tô conseguindo!
IronLynx, há um tempo parei com o projeto e acho q acabei perdendo os fontes que eu tinha, qualquer coisa eu faço de novo, estava fazendo uma parte de matemática financeira, tu acha que foge do escopo do projeto ? Qq coisa me da outra parte que eu faço.
Eu não acho que fuja não.Eu vou discutir com o Douglas uma forma mais dinâmica de tocar isso, como o backlog de tarefas, e mando um email para o pessoal. 
Fala Pessoal!!!Eu e o Douglas estamos pensando em por um release no ar(talvez semana que vem), e novas idéias serão sempre bem-vindas!!!
Um exemplo simplificado da parte de métricas:
import java.math.*;
public interface Area {
BigDecimal ACRE=new BigDecimal(0.[telefone removido]);
BigDecimal HECTARE=new BigDecimal(10000);
BigDecimal ALQUEIRES_MINEIROS=new BigDecimal(48400);
BigDecimal ALQUEIRES_DO_NORTE=new BigDecimal(27225);
BigDecimal ALQUEIRES_PAULISTA=new BigDecimal(24200);
BigDecimal ARES=new BigDecimal(0.0247105);
BigDecimal BRACAS_QUADRADAS=new BigDecimal(3.052);
BigDecimal BRACAS_DE_SESMARIA=new BigDecimal(14520);
BigDecimal QUADRAS_QUADRADAS=new BigDecimal(17424);
}
import java.math.*;
public class Hectare extends BigDecimal implements Area {
private static final long serialVersionUID = 1L;
public Hectare(){
super(0);
}
public Hectare(double value){
super(value);
}
public Hectare(String value) {
super(value);
}
public Hectare(BigDecimal value){
super(value.toString());
}
public Acre convertToAcres(){
return new Acre(this.multiply(ACRE));
}
}
import java.math.*;
public class Acre extends BigDecimal implements Area{
private static final long serialVersionUID = 1L;
public Acre(){
super(0);
}
public Acre(double value){
super(value);
}
public Acre(String value) {
super(value);
}
public Acre(BigDecimal value) {
super(value.toString());
}
private double value;
public Hectare convertToHectares(){
return new Hectare(this.multiply(HECTARE));
}
}
Hectare h2=new Acre("12345.9").convertToHectares();
Hectare h=new Acre(123.0).convertToHectares();
Acre a=new Hectare(100).convertToAcres();
Ante de tudo, parabéns pela biblioteca…
Mas estou um pouco confuso com isso, suas medidas ali estão uma hora em m², outras não… pra falar a verdade, só vi acre e hectare hehehe.
Segundo a wikipedia, 1 hectare vale 2,4710538 acres internacionais, mas no seu código ele vai retornar o valor de new BigDecimal(0.[telefone removido]) para:
Acre a=new Hectare(1).convertToAcres();
Ou eu estou enganado?
flw
Não está! 
Mas não se preocupe, eu ainda vou revisar no FDS todas as constantes, e a base será o M².(Menos quando houver a necessidade de milhas,KM…).
Para peso será o grama. 
OBS.: O único problema é que uma medida em M² de Acres dá m em converter para BigDecimal: 4.046,856.422
Acho que vou tolerar algo como 4046.856 e aceitar uma perda.
Olhando bem, não ficaria legal…
Pensando bem, acho melhor deixar a relação que uma tem para outra(no caso 1 Ha=2,4710538 acres e dar uma opção de converter em Metros Quadrados não?
Não tem muito jeito não… vou ter que refinar as constantes mesmo(e os métodos), vai ficar um pouco grande, mas ficará beem mais claro:
HECTARE_TO_ACRES=2,4710538, HECTARES_TO_SQUARE_METERS=10000… e por aí vai.
Acho que poderia facilitar se a base for uma só pra cada tipo de unidade, como metros, metros quadrados, gramas, e por aí vai. E também, se sua interface obrigar a implementar um método que converta a unidade desejada para a unidade base, algo assim:
public class Area {
public static final BigDecimal M2 = new BigDecimal(1);
public static final BigDecimal HECTARE = new BigDecimal(1);
public static final BigDecimal ACRE = new BigDecimal("4046.856422");
public static final BigDecimal UNIDADE_BASE = M2;
protected BigDecimal valor;
protected BigDecimal unidade;
public BigDecimal toBase() {
return valor.divide(unidade);
}
public BigDecimal convert(BigDecimal unidade) {
return toBase().multiply(unidade);
}
}
Chegando em casa, ou amanhã, penso um pouco mais sobre isso ehhehe, mas a minha idéia é por aí.
Flw
caraca que bom saber que o BrasilUtils nao esta parado, eu estava com umas ideias interessantes para integrar annotaton a ele, e algumas classses para manipulacao de datas.
Eu vou reler os posts desete topico pra ver quais sao as ideias e amanha de manha eu me cadastro…
flws!!!
Acho q tô + ou - entendendo, mas isso implica em chamar o método convert dentro do método que eu chamo para mudança de unidade não?Isso é BD(BigDecimal) e cada operação é lenta, duas multiplicações(ou duas divisões em sequência), podem acarretar custo(principalmente em números com dezenas de casas…), por isso eu tava falando do modo mais “rude” mesmo, tipo colocando uma constante (por ex. HECTARE_TO_ACRE) direto no método de conversão.Mas não sei se entendi direito, explique melhor.
Classe de manipulação de datas é sempre bom, mas quanto ao lance de anotações, isso é perigoso devido a necessidade de retrocompatibilidade com JDK´s inferiores ao Tiger(1.5.0).
Bom, é lento mas nem tanto assim, e tem como dar uma acelerada. Hoje fiz aqui umas classes que mostram mais ou menos minha idéia… veja o que você acha. Era uma idéia minha antiga, de fazer um conversor entre qualquer tipo de unidades para outra do mesmo tipo, mas que nunca tinha começado hehehe.
Dá pra fazer umas melhorias ainda, claro… na implementação eu levei em conta isso que vc disse de ter de fazer 2 operações pra converter pra outras unidades…
Falou 
import java.math.BigDecimal;
import java.math.MathContext;
public class Area implements ValorComUnidade {
/* unidades pré-definidas de área */
public static final Unidade M2 = new Unidade("m²", new BigDecimal(1, MathContext.DECIMAL32));
public static final Unidade HECTARE = new Unidade("hectare", new BigDecimal(10000, MathContext.DECIMAL32));
public static final Unidade ACRE = new Unidade("acre", new BigDecimal("4046.856422", MathContext.DECIMAL32));
public static final Unidade UNIDADE_BASE = M2;
BigDecimal valor;
BigDecimal valorNaBase;
Unidade unidade;
public ValorComUnidade convertTo(Unidade unidade) {
return new Area(valorNaBase.divide(unidade.getValorNaUnidadeBase(), MathContext.DECIMAL32), unidade);
}
public Unidade getUnidade() {
return unidade;
}
public void setUnidade(Unidade unidade) {
this.unidade = unidade;
this.valor = valorNaBase.divide(unidade.getValorNaUnidadeBase(), MathContext.DECIMAL32);
}
public BigDecimal getValor() {
return valor;
}
public void setValor(BigDecimal valor) {
this.valor = valor;
valorNaBase = valor.multiply(unidade.getValorNaUnidadeBase(), MathContext.DECIMAL32);
}
public Area(BigDecimal valor, Unidade unidade) {
this.valorNaBase = valor.multiply(unidade.getValorNaUnidadeBase(), MathContext.DECIMAL32);
this.valor = valor;
this.unidade = unidade;
}
@Override
public String toString() {
return "[valor=" + valor + ",unidade=" + unidade + ",valorNaBase=" + valorNaBase + "]";
}
public static void main(String[] args) {
Area area1 = new Area(new BigDecimal(10000, MathContext.DECIMAL32), Area.M2);
System.out.println(area1);
System.out.println(area1.convertTo(Area.HECTARE));
System.out.println(area1.convertTo(Area.ACRE));
}
}
Opa, que bom, hehehe
Bom, acho que é questão de costume mesmo… porque se não for assim, teríamos que ter um convertToxxx pra cada unidade de área, e vai saber quantas tem hehehe. Desse jeito acredito ser bem mais simples.
SIC? hehehe… vou dar um summon* nele usando MP
- 6ª feira, louco pra chegar em casa e jogar FF X!!! hehehe
flw
SIC? hehehe… vou dar um summon* nele usando MP
O CV agora ganha 200mil euros anuais lá na Zooropa, não entra mais em tópico de pobre não… :lol:
Tb acho.Mas seria legal se o pessoal se manifestasse…
Bom, eu vou rever todas as constantes nesse fim de semana(tem várias fontes erradas, acho que vou adotar a Wikipedia, mas nem sempre é seguro…)
Vocês poderia tirar uma dúvida minha?
O BrazilUtils propõe ser uma biblioteca de rotinas de validação, ou seria também uma API que propõe uma arquitetura de validação?
O BrazilUtils propõe ser uma biblioteca de rotinas de validação, ou seria também uma API que propõe uma arquitetura de validação?Não temos a prepotência de propormos uma arquitetura de validação.Acho arriscado até. Chequei as constantes de área:
import java.math.*;
public interface ConstantesDeArea{
//A base é Metros Quadrados
BigDecimal ACRE=new BigDecimal( 4046.8564224 );
BigDecimal ARES=new BigDecimal(100);
BigDecimal ALQUEIRES_MINEIROS=new BigDecimal(48400);
BigDecimal ALQUEIRES_DO_NORTE=new BigDecimal(27225);
BigDecimal ALQUEIRES_PAULISTA=new BigDecimal(24200);
BigDecimal BRACAS_QUADRADAS=new BigDecimal(3052);
BigDecimal BRACAS_DE_SESMARIA=new BigDecimal(14520);
BigDecimal CADEIAS_QUADRADAS= new BigDecimal(404.68564224);
BigDecimal HECTARE=new BigDecimal(10000);
BigDecimal JARDAS_QUADRADAS=new BigDecimal(0.83612736);
BigDecimal MILHA_QUADRADA=new BigDecimal(2589988.110336);
BigDecimal PES_QUADRADOS=new BigDecimal(0.09290304);
BigDecimal QUADRAS_QUADRADAS=new BigDecimal(17424);
BigDecimal QUILOMETRO_QUADRADO=new BigDecimal(1000000);
}
bom, só uma coisa, recomendo usar, quando for número com casas decimais, o construtor com String, e em todos eles passando um MathContext, pois senão nas divisões pode gerar exceção aritmética quando o resultado não for exato (como 10 / 3). Isso aconteceu nos meus testes e resolvi usando o construtor assim:
new BigDecimal("4046.856422", MathContext.DECIMAL32)
flw
É eu sabia disso, até que na API tá claro:
When a MathContext object is supplied with a precision setting of 0 (for example, MathContext.UNLIMITED), arithmetic operations are exact, as are the arithmetic methods which take no MathContext object. (This is the only behavior that was supported in releases prior to 5.) As a corollary of computing the exact result, the rounding mode setting of a MathContext object with a precision setting of 0 is not used and thus irrelevant. In the case of divide, the exact quotient could have an infinitely long decimal expansion; for example, 1 divided by 3. If the quotient has a nonterminating decimal expansion and the operation is specified to return an exact result, an ArithmeticException is thrown. Otherwise, the exact result of the division is returned, as done for other operations.
Mas eu acho q devemos usar, quando o usuário for dividir, DECIMAL128, pois permite 34 casas.É melhor permitirmos com o máximo possível do que com os menores e deixar o usuário decidir.
Outra coisa, é que na Area:
Area area1 = new Area(new BigDecimal(10000, MathContext.DECIMAL32), Area.M2);
Será q isso seria tão claro quanto
Area=new Area(BD valor,Unidade unidadeAtual,Unidade unidadeParaConversao);
para o usuário?Sabe, para mim da forma que vc fez tah clara, mas devemos pensar na forma que fique mais “mole” para quem for utilizar.
O que vc acha?
Acho que desse jeito aí não faz muito sentido, você já passa a unidade que vai converter no construtor? Eu não entendi isso muito bem…
Na verdade eu postei errado, era para ser:
Area a=new Area();
e aí na chamada de método:
a.convertTo(BD valor,Unidade unidadeOriginal,Unidade unidadeParaConversao);
ou passar o valor no construtor:
Area a=new Area(BD valor);
e fazer uma chamada tipo a.convertTo(Origem,Destino);
Sacou?E não podemos usar um construtor só com BD, pq se o cara passa um outro tipo de valor teremos problemas.Podemos fazer um super.toString() quando necessário com a classe extendendo BigDecimal.
Ah, abri um blog para o projeto:
<a href="http://brazilutils.blogspot.com/">http://brazilutils.blogspot.com/</a>
Assim quando o guj tiver down, discutimos lá…
Ah, abri um blog para o projeto:
http://brazilutils.blogspot.com/
Assim quando o guj tiver down, discutimos lá…
Bem, aqui é tudo bloqueado e pouca coisa liberada, e essa infelizmente não é umas das poucas coisas…
Na verdade eu postei errado, era para ser:
Area a=new Area();e aí na chamada de método:
a.convertTo(BD valor,Unidade unidadeOriginal,Unidade unidadeParaConversao);
Bom, nada contra um método assim, mas se deve passar tudo isso, então ele deveria ser estático certo? Tipo:
Area.convertTo(BD valor,Unidade unidadeOriginal,Unidade unidadeParaConversao);
Acho que a unidade deve fazer parte mesmo da área, já que sem ela o que tem ali é apenas um número sem um maior significado… mas essa é a minha opinião só, e o pessoal não vem nem dar opinião tá louco…
flw
Y!Mas não é lá muito elegante…
Por isso eu defendia cada unidade como classe e Área como superclasse de cada unidade.Fica mais claro a conversão de Hectare.convertTo(Unit unitToBeConverted) do q Area.convertTo…
Depois me “bombam” via email dizendo que eu tomei alguma decisão totalitária. Esse é um dos motivos na qual eu e o Douglas resolvemos tocar o projeto “na surdina”.Muito oba-oba e pouca contribuição(não desmerecendo os que já contribuíram como o Dango).Eu vou mandar um email explicando para o pessoal dar idéias e tal, mas eu quero acertar os detalhes mais rápido possível.Em Setembro tem que rolar um “mini-release” ao menos.A falta de um PM prejudica bastante também.
dudaskank,
sugestões do Cv:
Hectare h = new Hectare(valor);
MetroQuadrado m2 = (MetroQuadrado) h.to(MetroQuadrado.class);
Passando ao método to a classe via reflection.(mantendo o extends BigDecimal e implementando uma interface de constantes).
Ele ainda sugeriu Generics:
public <T extends Area> T to(Class<T>) {…}
Mas isso mandaria para o saco a galera do 1.4 para baixo…
<blockquote><div class="quote-author">Ironlynx:</div>dudaskank,
sugestões do Cv:
Hectare h = new Hectare(valor);
MetroQuadrado m2 = (MetroQuadrado) h.to(MetroQuadrado.class);
Passando ao método to a classe via reflection.(mantendo o extends BigDecimal e implementando uma interface de constantes).
Ele ainda sugeriu Generics:
public <T extends Area> T to(Class<T>) {…}
Mas isso mandaria para o saco a galera do 1.4 para baixo…
Hmm, eu acho que é por aí, mas eu acho que é mais complicado assim. Apesar de nem ser tão diferente do que fiz…
Essa interface de constantes até acho que não precisa desse jeito, já que vai estender Area pode colocar as constantes nela também.
Ah, mas isso é normal, não tem como agradar a todos… e o pessoal fala que vai contribuir mais na base da empolgação mesmo, aí chega na hora e não sabe o que fazer… parece eu no Sábado rsrsrs
flw
<blockquote><div class="quote-author">Ironlynx:</div>dudaskank,
sugestões do Cv:
Hectare h = new Hectare(valor);
MetroQuadrado m2 = (MetroQuadrado) h.to(MetroQuadrado.class);
Passando ao método to a classe via reflection.(mantendo o extends BigDecimal e implementando uma interface de constantes).
Ele ainda sugeriu Generics:
public <T extends Area> T to(Class<T>) {…}
Mas isso mandaria para o saco a galera do 1.4 para baixo…
Por isso que eu digo que Java devia ter diretivas de compilação…
Ola Pessoal onde eu abaixo a API BrazilUtils???
Ola Pessoal onde eu abaixo a API BrazilUtils???
Pior hein, já querem botar o bicho feio chamado closures, por que não algo pra fazer:
#ifdef JAVA_5
public <T extends Area> T to(Class<T>) {...}
#endif
hehehe
Pô, closures é lindo e mais velho que o pterodáctilo! 
Essa interface de constantes até acho que não precisa desse jeito, já que vai estender Area pode colocar as constantes nela também.
Opa, eu faço Area extender BD e implementar a interface de constantes.
Acho legal uma interface só de constantes pq é algo que teoricamente pode mudar mais.E a interface ficaria um nível acima na escala de packages, tipo em org.brazilutils.metrics, e não em org.brazilutils.metrics.br pq se alguem for utilizar em outros packs de outros países, estará ok(claro q eu mantenho essas constantes em inglês, mas não altera muita coisa).
O único problema dessa abordagem:
MetroQuadrado m2 = (MetroQuadrado) h.to(MetroQuadrado.class);
é o custo do reflection!Mas creio que não é nada tãaao significativo.
E aí, galera? Beleza?
Primeiro, parabéns pela iniciativa! Tenho trocado idéia com o Ironlyns, já estou cadastrado no java.net e fiquei responsável pelo pacote currency.
Estou preparando aquela classe que deixa valores monetários escritos por extenso.
Enfim, estou criando dois métodos sobrecarregados:
- public static String porExtenso(BigDecimal currency);
- public static String porExtenso(String currency);
*EDITADO: os métodos porExtenso não serão estáticos. Há bons motivos de sobra para essa decisão.
Deixei os nomes em português porque não tenho a menor noção de como fazê-los ter sentido em inglês.
A minha idéia é fazer os métodos verificarem se os parâmetros tem escala dois ou três. Se tiver outra escala, maior que três por exemplo, joga uma excessão.
Mas, meu problema mesmo é com as casas decimais. Eu preciso separar o valor inteiro do decimal. Ex: R$ 6.432,24 ficaria 6432 numa variável e 24 noutra.
Tive uma idéia, mas acheio tosca. Teria que converter para String, encontrar a vírgula e separar os “dois lados da moeda”… Mas daí, teria que voltar pra BigDecimal novamente para fazer os cálculos.
Vocês têm alguma outra idéia?
T +!
Lembre-se de deixar no package currency.br, vai que alguém resolver fazer uma versão para dólares/libras/etc.
Boa.
Mas, meu problema mesmo é com as casas decimais. Eu preciso separar o valor inteiro do decimal. Ex: R$ 6.432,24 ficaria 6432 numa variável e 24 noutra.
Aquela classe que mostrei não lhe ajudou?
Esse é o método tradicional.Lembre-se de usar um StringBuffer(eu iria dizer para usar StringBuilder mas há muitos 1.4 ainda…) na concatenação.
Bem, se você já tem ele em BigDecimal E puder usar java 5, tem os métodos:
public BigDecimal[] divideAndRemainder(BigDecimal divisor)
public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc)
Caso não, apesar de provavelmente ser parecida a classe que o Ironlynx deve ter te mandado, veja se isso ajuda:
package teste.guj;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class TesteBigDecimalResto {
public static void main(String[] args) {
BigDecimal n = new BigDecimal("123456.789");
BigDecimal parteInteira = n.setScale(0, RoundingMode.DOWN);
BigDecimal parteDecimal = n.subtract(parteInteira).movePointRight(n.scale());
System.out.println(n);
System.out.println(parteInteira);
System.out.println(parteDecimal);
}
}
Lembre-se de usar um StringBuffer(eu iria dizer para usar StringBuilder mas há muitos 1.4 ainda…) na concatenação.
Não posso mesmo usar o que é específico do Java 5?! Mas as classes do Douglas já usam Enum!
O que eu penso é que temos que tirar o melhor possível do Java, até para eliminar certas barreiras… Sem querer ser chato, mas quem tiver problemas de compatibilidade que veja o código e adapte as classes de acordo com a sua necessidade. E se mandasse pra gente melhor ainda! Já teríamos a nossa própria versão de Vector vs. ArrayList!
Chefe, você não pode dar um jeito? Compatibilidade é mais importante que desempenho mesmo? Vou esperar sua resposta para começar a programar.
Bem, se você já tem ele em BigDecimal E puder usar java 5, tem os métodos:
public BigDecimal[] divideAndRemainder(BigDecimal divisor) public BigDecimal[] divideAndRemainder(BigDecimal divisor, MathContext mc)
Valeu! Como disse, espero poder usar o que já está no Java 1.5.
Tá ok… vcs venceram!Liberado o uso do Tiger!
Eu acho Desempenho mais importante que retrocompatibilidade, mas se preparem que eu vou redirecionar eventuais reclamações via email direto para suas respectivas caixas… :lol:
Tá ok… vcs venceram!Liberado o uso do Tiger!
Eu acho Desempenho mais importante que retrocompatibilidade, mas se preparem que eu vou redirecionar eventuais reclamações via email direto para suas respectivas caixas… :lol:
Pode mandar! Eu trabalhei numa empresa grande e burocrática, já aprendi como agir nesses casos: é só fazer uma resposta padrão! hehe
Sr. ou Sra. Fula de Tal (Nome aqui! Não enviar Fulano de Tal!)
Entendemos a sua preocupação e sua vontade de usar essa incrível biblioteca de utilidades.
Mas, no momento não podemos atendê-lo. Isso porque ainda não descobrimos uma maneira de agradar a gregos e troianos. Não ficaremos ofendidos com os seus impropérios porque sabemos que é mais fácil nos xingar que xingar os seus chefes - a não ser, é claro, que você xingue seu chefe por dentro! E é mais fácil seus chefes fazerem você usar Java 1.4 (ou 1.3!) do que convecer os clientes da sua empresa a colocar a mão no bolso e usa o Java 5.
É uma situação triste, lamentamos por isso, mas não podemos fazer nada. Obrigado por nos deixar saber o que você pensa (mesmo que isso não adiante nada)!
Mas as nossas portas estão abertas para você. Além de chorar, você também pode coloborar com o BrazilUTILS! Descubra como fazer (o objeto da reclamação aqui) de forma compatível com a versão 1.4 e mande para o nosso CVS no java.net.
Atenciosamente!
Rafael.
Hahaha, muito boa essa carta Rafael!
Bem, eu ainda não faço parte oficialmente do projeto, então não adianta mandar e-mail pra mim hehehehe, manda tudo pro Rafael rsrsrs.
Aliás, vou ver se encontro onde começa a participar, pelo menos com alguns códigos acho que consigo hehe.
Assim eu aproveito e pego experiência pra começar um projeto que to querendo colocar lá também 
flw
Ironlynx e Rafael,
Acho que a questão de usar 1.4 ou 5.0 deve ser pensada com mais calma. Lembrem-se que fazer na 5.0 vai impedir que muita gente use a API. Quanto a questão do desempenho, acho que algum ganho nesse sentido está muito mais ligado em como o sistema cliente é feito do que nas APIs que são rápidas ou lentas. As funcionalidades não me parecem críticas: validação, código de barras; cálculos talvez.
Pessoalmente acho que deveríamos fazer na 1.4 e aumentar o leque de pessoas usando a API e dando retorno.
Tive uma experiência aqui no projeto tremendamente desagradável de ter que desfazer código feito em 5.0 para 1.4 justamente porque o servidor de aplicação ainda não estava pronto para 5.0. Isso é uma realizade bastante comum.
Nós nem fizemos um levantamento de qual parte da API precisaria mesmo se feita em 5.0, acho que devemos começar por aí.
Realmente não são críticas.Mas o problema que eu tô vendo é que liberar uma parte em Java5 vai tornar o projeto inteiro java5 uma vez que não teremos(em princípio) libs separadas…
dudansk, pq vc não se filia ao projeto e tenta ajudar o Rafael nessa empreitada?
Na verdade, vc já disse(a parte de cálculos até pq operações com BigDecimal são lentas).
Ironlynx, uma sugestão:
Que tal editar sua primeira mensagem neste post colocando o link para o projeto e um resumo do que ele faz e qual a versão mais recente. Fica mais fácil para quem entrar nesse post saber que o projeto não está morto e que existe release.
[]'s
Se dudansk for eu (rsrsrsrs) to no projeto já. Mandarei mp pro Rafael ver o que ele está precisando pra eu ir dando uma ajuda… espero poder contribuir com algo útil neste projeto 
Sobre java 1.4 ou 5, vou me esforçar então para utilizar o 1.4. Vi agora que o tal MathContext é só no 5, então vou procurar não usar essa classe.
flw
Douglas, compreendo isso.
Na minha visão limitada, de developer lidando com o pacote currency.br, Java 5 é a escolha sem sombra de dúvidas. O processamento das rotinas será pesado, e vamos utiilzar BigDecimal pra todo que é canto. Mas, além da velocidade, tem outros motivos pelo qual eu usaria o Java 5 aqui.
Note que é uma visão bem focada nesse caso específico, e reconheço que, ampliando a perspectiva, Java 1.4 pode ser a melhor solução.
Mas recomendo: vamos resolver essa questão e, assim que resolvida, todos terão que “vestir a camisa” para não voltar mais nesse assunto e partirmos para os outros problemas que nos esperam!
T+!
Bem vindo!
Como disse ao Dudaskank, estou pensando em fazer algo parecido com o que o Douglas fez com as classes para inscrição estadual, cnpj, só que focando cálculos de impostos, etc. A parte financeira/tributária é bastante complexa no Brasil e, segundo um professor meu, que é administrador, sempre nos dá (programadores) muito trabalho.
Tenho que fazer um documento de requisitos para o currency.br, mas pretendo fazer algo além de conversões entre moedas. Se estiverem de acordo com esse proposto, poderemos seguir adiante.
Ok.Vou mudar lá.
Certo, um TODO é sempre bom.
E eu nem precisei quebrar a cabeça! Olha só o que vocês mesmo andaram sugerindo logo no começo do projeto:
Requisitos do pacote currency.brSugeridos pelo thingol:
- validação de módulo 10 e 11, de boletos bancários e de concessionárias públicas;
- validação de números de contas dos diversos bancos;
- validação de números de cartões de crédito (o algoritmo de Luhn vale para todas as operadoras, ou tem mais alguma coisa?)
Sugeridos pelo Douglas:
- cálculos padronizados de impostos federais, estaduais e municipais;
- valores de alíquotas de impostos como constantes;
- enquadramento nas faixas e cálculo do Imposto de Renda para sistemas de RH;
- GenericNotaFiscal e AbstractOrdemDeServico
- coisas como valor/percentual de retenção de imposto, qual imposto recolher dependendo do valor e outras.
Como ponto de partida, está ótimo.
O que fiz até agora, com base num artigo que me passaram. Essa primeira parte está quase pronta.
Mas, tenho ainda que descobrir como fazer os milhões, bilhões e trilhões da vida ficarem no plural quando for o caso, colocar a vírgula quando necessário.
*EDITADO: esqueçam as vírgulas!!!
Depois, acho que fica mais fácil. A partir de um BigDecimal, verifica-se a escala. Se estiver beleza, separa a parte inteira dos centavos, transforma os dois em int e joga no método convert.
package org.brazilutils.currency.br;
import java.math.BigDecimal;
import java.lang.StringBuffer;
/**
*
* @author Rafael Fiume
* @version 0.1
* @see http://www.rgagnon.com/javadetails/java-0426.html
*/
public class CurrencyConverterToText {
private static final String[] grandeNumeros = {
"",
"mil",
"milhão",
"bilhão",
"trilhão",
"quatrilhão"
};
private static final String[] grandeNumerosPlural = {
"",
"mil",
"milhões",
"bilhões",
"trilhões",
"quatrilhões"
};
private static final String[] centenas = {
"",
"cento",
"duzentos",
"trezentos",
"quatrocentos",
"quinhentos",
"seissentos",
"setecentos",
"oitocentos",
"novecentos"
};
private static final String[] dezenas = {
"",
"dez", // Apenas para deixar cada número "em seu lugar" -> dezenas[2] == "vinte"
"vinte",
"trinta",
"quarenta",
"cinqüenta",
"sessenta",
"setenta",
"oitenta",
"noventa"
};
private static final String[] numeros = {
"",
"um",
"dois",
"três",
"quantro",
"cinco",
"seis",
"sete",
"oito",
"nove",
"dez",
"onze",
"doze",
"treze",
"quatorze",
"quinze",
"dezesseis",
"dezessete",
"dezoito",
"dezenove"
};
private StringBuffer convertLessThanOneThousand(int numero) {
StringBuffer numPorExtenso = new StringBuffer("");
if (numero == 0)
return numPorExtenso;
if (numero % 100 < 20){
numPorExtenso.append(numeros[numero % 100]);
numero /= 100;
if(numero > 0) {
numPorExtenso.insert(0, " e ");
}
} else {
numPorExtenso.append(numeros[numero % 10]);
numero /= 10;
numPorExtenso.insert(0, " e ");
numPorExtenso.insert(0, dezenas[numero % 10]);
numero /= 10;
}
if(numero > 0) {
numPorExtenso.insert(0, " e ");
}
return numPorExtenso.insert(0, centenas[numero]);
}
private String convert(int numero) {
StringBuffer numPorExtenso = new StringBuffer("");
String prefix = "";
String sufix = "";
if (numero == 0) {
return "";
}
/* Números negativos ficam entre parênteses.
* Ex: positivo -> 1269, negativo -> (1269) */
if (numero < 0) {
numero = -numero;
prefix = "(";
sufix = ")";
}
int casa_milhar = 0;
do {
int n = numero % 1000;
if (n != 0) {
StringBuffer s = convertLessThanOneThousand(n);
numPorExtenso = s.append(" " + grandeNumeros[casa_milhar]).append(" " + numPorExtenso);
}
casa_milhar++;
numero /= 1000;
} while (numero > 0);
return (prefix + numPorExtenso + sufix).trim();
}
//////////////////////////////////////////////////////////////////////////////////////////
/*
* Retorna o valor monetário por extenso, a partir de um BigDecimal com
* escala dois ou três.
*
* @param currency currency o valor do dinheiro @returns dinheiro por
* extenso.
*/
public static String porExtenso(BigDecimal currency) {
int scale= currency.scale();
if ((scale != 2) || (scale != 3)) {
throw new RuntimeException("A escala deve ser igual a dois ou três.");
}
return new String(); //
}
/*
* Retorna o valor monetário por extenso, a partir de uma representação
* textual de valor monetário.
*
* @param currency currency o valor do dinheiro @returns dinheiro por
* extenso.
*/
public static String porExtenso(String currency) {
return "Ainda não implementado";
}
public static void main(String[] args) {
CurrencyConverterToText converter = new CurrencyConverterToText();
System.out.println(converter.convert(12687));
System.out.println(converter.convert(324));
System.out.println(converter.convert(25));
System.out.println(converter.convert(5));
System.out.println(converter.convert(896558475));
System.out.println(converter.convert(9));
System.out.println(converter.convert(-255445852));
}
}
doze mil seissentos e oitenta e sete
trezentos e vinte e quantro
vinte e cinco
cinco
oitocentos e noventa e seis milhão quinhentos e cinqüenta e oito mil quatrocentos e setenta e cinco
nove
(duzentos e cinqüenta e cinco milhão quatrocentos e quarenta e cinco mil oitocentos e cinqüenta e dois )
Rafael, algumas dessas features terão que ser revistas.
Boletos bancários ficam melhor no JBoleto:
http://jboleto.kobi.com.br/
Eu não tinha lhe passado um que já fazia até os centavos?
O problema estava no milhar de centavos…
E vejo um problema com o nome da classe:
CurrencyConverterToText
Melhor deixar integralmente em inglês, e talvez por algo dizendo que o texto esta sendo convertido para reais, ou vc vai criar uma classe genérica de conversão de número para texto por extenso(o que é uma boa), e quanto for necessário, usar um método “converterParaReais” ou algo assim???
RESPOSTA 1: E quem vai redefinir os requisitos?
RESPOSTA 2: Calma, rapaz! Um passo por vez. Aproveitei ao máximo um tempinho que arranjei. Como eu disse, nem essa primeira parte está pronta ainda. Se você ler novamente o passo-a-passo que fiz antes do código, vai ver que entre as etapas a serem feitas está “separar a parte inteira dos centavos”.
RESPOSTA 3: E não, não estou pensando em localizar genéricamente a classe, porque meu grande interesse nesse projeto é mesmo as coisas especificas do Brasil.
Me dê uma sugestão pro nome da classe. Pode me sugerir, Inclusive, nomes de métodos e variáveis se achar necessário.
T+!
Vamos discutir isso na lista ou lá no blog?Vou dar um toque no Douglas, mas desses apresentados, quais vc acha que conseguiria tocar?Para o mini release, faça só as classes de conversão para texto mesmo.
Tá ok.Não entendi o que vc tava fazendo.
Vc misturou os idiomas: CurrencyConverterToText
Deixa ConvertToText.Mas eu preferia ConvertToReais.Assim pode rolar um ConvertToDollars,ToEuros…(claro, em diferentes packages)
Eu tinha pensado que vc tava fazendo uma classe genérica de conversão e daí na ConvertToReais vc estenderia o necessário.huahua… eu que viajei no q vc tava fazendo! :lol:
Pode ser que eu esteja viajando, mas acho que esse tipo de discussão, que envolve muita troca de mensagens entre muitos participantes, se dá mehor na lista de discussões do java.net ou num grupo como o yahoogrupos.
O blog do BrazilUTILS poderia ser uma espécie de canal de relações públicas. Você poderia deixar posts sobre o caminhar do projeto, planos futuros, suas impressões sobre os resultados. Daí os usuários do BrazilUTILS e nós mesmos íamos comentando.
E o guj é ideal para colocar códigos, tirar dúvidas, mostrar as primeiras idéias de requisitos para ver se a comunidade aprova. O guj facilita a colaboração, e mesmo o chumbo grosso de críticas (às vezes) é bem vindo, desde que não apenas critiquem, mas contribuam com uma solução.
Todos. Aos poucos, espero que nem tão aos poucos assim, eles vão saindo. Depois isso é só o começo, tem muita coisa a ser feita e tenho certeza que não vou fazer tudo sozinho. Tem muita gente nesse projeto. O Dudaskank já está trabalhando neles também.
ConvertToReais é bem melhor! Valeu!
A saída do valor por extenso de um número negativo pode ser de dois jeitos:
(mil novecentos e oito reais negativo) ou apenas
(mil novecentos e oito reais) Qual a melhor forma?
Só confirmando, o nome da classe é org.brazilutils.currency.br.ConvertToReais ?
Tb acho.Vou deixar o blog para press release então.
Ignore números negativos.O que importa são eles por extenso.Se alguém precisar, colocaria esse negativo depois.
É.
Foi mal não te responder antes, mas fiquei sem net ontem.
Pronto!
Isso aqui:ConvertToReais converter = new ConvertToReais();
System.out.println(converter.porExtenso(new BigDecimal(-1).setScale(2, RoundingMode.HALF_DOWN)));
System.out.println(converter.porExtenso(new BigDecimal(896558475).setScale(2, RoundingMode.HALF_DOWN)));
System.out.println(converter.porExtenso(new BigDecimal(0.01).setScale(2, RoundingMode.HALF_DOWN)));
System.out.println(converter.porExtenso(new BigDecimal(30).setScale(2, RoundingMode.HALF_DOWN)));
System.out.println(converter.porExtenso(new BigDecimal(0.001).setScale(3, RoundingMode.HALF_DOWN)));
System.out.println(converter.porExtenso(new BigDecimal(-100.04).setScale(2, RoundingMode.HALF_DOWN)));
System.out.println(converter.porExtenso(new BigDecimal(120.04).setScale(2, RoundingMode.HALF_DOWN)));
System.out.println(converter.porExtenso("100101.87"));
System.out.println(converter.porExtenso("[telefone removido].991"));
System.out.println(converter.porExtenso(new BigDecimal(12687.013).setScale(3, RoundingMode.HALF_DOWN)));
converter.setNegativePrefix("(");
converter.setNegativeSufix(") - Negativo?!! haha! Se mata véio...");
converter.setPositivePrefix("");
converter.setPositiveSufix(" - Fala amigão!! ");
System.out.println(converter.porExtenso(new BigDecimal(100000000).setScale(2, RoundingMode.HALF_DOWN)));
System.out.println(converter.porExtenso(new BigDecimal(-[telefone removido]).setScale(2, RoundingMode.HALF_DOWN)));
// Pau aqui!!! Escala diferente de dois ou três.
//System.out.println(converter.porExtenso(new BigDecimal(0.3).setScale(1, RoundingMode.HALF_DOWN)));
//System.out.println(converter.porExtenso(new BigDecimal(1413.1411).setScale(4, RoundingMode.HALF_DOWN)));
um real
oitocentos e noventa e seis milhões quinhentos e cinqüenta e oito mil quatrocentos e setenta e cinco reais
um centavo
trinta reais
um milhar de real
cem reais e quatro centavos
cento e vinte reais e quatro centavos
cem mil cento e um reais e oitenta e sete centavos
um bilhão um milhão de reais e novecentos e noventa e um milhar de real
doze mil seissentos e oitenta e sete reais e treze milhar de real
cem milhões de reais - Fala amigão!!
(dois bilhões de reais) - Negativo?!! haha! Se mata véio...
Melhor deixar o usuário definir quais prefixos e sufixos usar, a moda DecimalFormat.
[EDITADO]
[color=darkred]Atenção:[/color] esse código-fonte está desatualizado.
Para obter o código atualizado, utilize o CVS do projeto BrazilUtils em https://brazilutils.dev.java.net
[/EDITADO]
Hehehe, ficou legal mesmo.
Só ta faltando passar o corretor ortográfico…
doze mil seissentos e oitenta e sete reais e treze milhar de real
600 = seiscentos 
Mas… voltando ao nome ainda. Essa classe pode ser usada não só para reais, mas pra qualquer número, então acho que ConvertToReais não parece pra mim um bom nome…
Sei lá, que tal uma interface NumeroPorExtenso (em inglês não sei como fica) e depois as implementações dela, pelo menos uma pra Português BR, como NumeroPorExtensoPTBR?
Ah, Rafael, mandei pra vc e depois pro Ironlynx umas classes que fiz também, veja o que acha e me fala… flw
[edit]Epa, deixa pra lá o que eu disse, nesse caso é só pra Real mesmo hehehe, mas a idéia está dada (NumeroPorExtensoReais?) rsrsrs
Putz!! :shock:
Ía mostrar pra minha mãe essa classe e nem vou mais! hehe!
O que o sono não faz com uma pessoa. Essa escapou, mas as outras (oitocentos, etc.) estão certas, né? Melhor vocês verificarem, porque já estou dormindo aqui…
Quanto a generalização da classe, não é bem assim não! Cada língua tem as suas particularidades, suas regras. o que muda completamente o algoritmo. Fazer uma dessa em inglês é bem mais fácil, já em francês é mais difícil.
A única coisa que é possível generalizar é o nome dos métodos públicos, o que irá render no máximo uma interface.
Bem, o nome da classe… Sei lá! Acho que agora eu vou dormir, mesmo!
T+!
Esquenta não, normal… mas tudo que tem centos no nome é com c mesmo.
Vai dormir é? Queria estar em casa dormindo ou não fazendo nada… mas enfim. Só depois das 20:00.
flw
[edit]sua mãe é programadora também?
Tô ligado! Foi um escorregão… Pode ver que os outros (setecentos, oitocentos, novecentos) estão certos. Fui correndo ver! hehe
Minha mão nem sabe lidar com computador, quanto mais programar!! Mas é que eu fiquei tão feliz em terminar essa classe!
haha
Queria estar em casa, é? Azar teu! :lol: Ou faça como eu, trabalhe de madrugada. Acho muito melhor.
*EDITADO: outra coisa Dudaskank! Se você for verificar o método divideAndRemainder, vai ver que o seu nome está lá, como o autor daquele método. Beleza?
**EDITADO: e cadê as classes que você disse que mandou?
Eu ainda prefiro dormir de madrugada… pelo menos de 2ª a 5ª…
Estranho, mandei pro seu e-mail… vou anexar por aqui também então. E valeu pela lembrança no método lá hehehe
e o último arquivo faltando…
tem método main pra testar em CheckLuhn e LuhnInputVerifier, mas precisa ajustar os pacotes antes de rodar eles. Tá parecendo que funciona, pelo menos com meu cartão passou.
flw
Tô lendo as classes de vcs aqui…
Rafael, milhar não, milésimos de real.Use comentários em inglês.
Quando for testar a funcionalidade, crie uma classe a parte, algo do tipo ConvertToReaisTest, sacou?
dudansk(eduardo), o algotimo de luhn atende a todas as operadoras de cartão de crédito???
Eu tava vando aqui para comparar com a sua(Vc fez GUI e tudo mais):
http://www.theeggeadventure.com/wikimedia/index.php/LUHN_Source_Code
Bom, se serve pra todas eu realmente não sei não, mas pelo menos com o meu cartão foi hehehe.
É, fiz uma gui bem meia boca e misturada com as classes lá, mas só pra testar claro. Acho que devia ter feito uma classe de testes agora que você falou hehe.
flw
Já está tudo de acordo, com comentários em inglês e demais acertos, no CVS.
Só um probleminha. Porque programo no Ubuntu, alguns caracteres não saem de acordo. Ex: “três” saiu “três”.
Fora isso, está tudo certo.
Muito fera a iniciativa !
parabéns mesmo !!

Pessoal,
Estava devendo uma geral no código que eu fiz há algum tempo. Gostaria de saber se alguém esta usando alguma parte da API, principalmente do pacote br. Estou querendo dar um super refactoring, pois o código que está lá é da época que estávamos testanto várias idéias. Hoje eu baixei os fontes e vi que tem muita porcaria que precisa sair, além de adaptar o código ao java 1.4, se for o caso.
Aparente mente os pacotes cpfCnpj, telefone e uf/ie (inscrição estadual) não sofreram grandes mudanças mas o resto deve passar por uma geral. Essa é uma boa hora pra dar alguma opinião pois já já deve sair o prmeiro release.
Devemos ter cuidado com o que entra nessa primeira distribuição pra não ter que tirar ou mudar muito depois. Por isso quero fazer isso agora.
Rafael,
Quanto ao email que você me mandou, vou responder aqui pois pode valer pra outros membros do projeto também. Acho que o prioritário é terminar e testar as classes que já estão lá, senão é mais um ano pra sair a primeira versão.
Se você leu o post inteiro, percebeu que algumas sugestões foram bem loucas (muitas minhas a propósito), e que sequer foram pra frente. No início, o objetivo era levantar idéias mesmo, mas algumas acho meio fora de escopo. O objetivo do projeto é gerar uma API, algumas idéias estavam muito além disso, alguns códigos que fiz (como o de validação) também foram muito longe tomando caminho de uma espécie de framework, o que é um pouco demais (por isso o refactoring). Se alguém quiser pensar/criar novas classes, pelo menos agora, pensem am algo pequeno e específico, como foi o pacote de código de barra, que ficou muito bom.
Aguardo retorno
Boa colocação. E outra muito importante:Testem!Façam testes e mais testes, quantos forem possíveis e necessários.
Eu por exemplo, ainda estou na dúvida se uso Reflection na parte de métricas.Acho que quando passa das 30 casas decimais a coisa desanda…
Talvez use a forma do Dudansk mesmo.
Essa é uma boa hora pra dar alguma opinião pois já já deve sair o prmeiro release.
Acho que a classe que acabei de mandar pro CVS, ConvertToReais.java, não deve ficar no pacote currency.br, mas sim num pacote chamado text, a moda DecimalFormat.
E ConvertToReais é um nome ambíguo, pois alguém poderia pensar que sua função é passar dólar pra real, quando na verdade, é passar valores monetários em reais para valores monetários em reais por extenso. A rigor, não está convertando nada para reais. Dudaskank sugeriu ReaisPorExtenso.java, algo parecido com a classe do Iron: NumeroPorExtenso.java.
Para isso acho que seria útil uma declaração de missão para a API e também a visão. São conceitos de administração que cabem bem aqui. Quando pensar numa nova classe, imediatamente vou perceber se está dentro do foco do projeto. Vocês já conseguem imaginar uma BrazilUtils 9.14.369 ??! O que tem nela?
O objetivo do projeto é gerar uma API, algumas idéias estavam muito além disso, alguns códigos que fiz (como o de validação) também foram muito longe tomando caminho de uma espécie de framework, o que é um pouco demais (por isso o refactoring). Se alguém quiser pensar/criar novas classes, pelo menos agora, pensem am algo pequeno e específico, como foi o pacote de código de barra, que ficou muito bom.
Acredite! hehe! Eu li tudo!
O que pensei sobre a BrazilUtils é que ela se propõe a fazer o que nós, programadores de java brasileiros, temos que fazer sempre, cada um do seu jeito, aumentando nossa produtividade. Não sei se estou certo. Sinto falta de um esclarecimento sobre a missão, sobre os objetivos, sobre a visão do projeto, como disse antes.
Testem!Façam testes e mais testes, quantos forem possíveis e necessários.
E quem melhor pra testar do que os usuários? Veja a classe do Dudaskank, por exemplo. Imagine testar todos os cartões de crédito: “ô tio chega aqui, que cartão de crédito você usa? E você vó ?”
Vai ficar difícil. É claro que não estou dizendo para mandar coisas que não funcionem. Mas daí até testar todos os casos possíveis vai uma looooonga distância.
No java.net, se eu não me engano, tem um e-mail só para relatar bugs, assim como todo projeto open-source. É melhor deixar bem claro qual é esse e-mail e algumas regras para quem for relatá-los.
Fica mais explícito o que mesmo.Mas é melhor por em inglês.
Para esse problema de “versionamento” e “o que deve conter tal versão” eu tinha pensado em algo que poderíamos chamar de Application Specification Request(ASR) tipo a JSR do java.Faríamos(melhorariamos) uma lista de features a ser feita no projeto, e depois no release ilustraríamos o que foi efetivamente executado.
Sim, está.A API BU é um mero facilitador de desenvolvimento.Não temos pretensão de ser uma Arquitetura de Validação ou algo do gênero.Vou tentar depois ilustrar isso melhor la no java.net.
Quando falo testar, digo dentro do possível.É comum o pessoal enviar o código sem ter o trabalho de fazer uma classe mínima de testes e isso acaba fazendo muita diferença.
Fica mais explícito o que mesmo.Mas é melhor por em inglês.
Para esse problema de “versionamento” e “o que deve conter tal versão” eu tinha pensado em algo que poderíamos chamar de Application Specification Request(ASR) tipo a JSR do java.Faríamos(melhorariamos) uma lista de features a ser feita no projeto, e depois no release ilustraríamos o que foi efetivamente executado.
Sim, está.A API BU é um mero facilitador de desenvolvimento.Não temos pretensão de ser uma Arquitetura de Validação ou algo do gênero.Vou tentar depois ilustrar isso melhor la no java.net.
Quando falo testar, digo dentro do possível.É comum o pessoal enviar o código sem ter o trabalho de fazer uma classe mínima de testes e isso acaba fazendo muita diferença.
Como está o andamento deste projeto?
Ele morreu?!
Ainda não encontrei nada publicado nesta pagina: https://brazilutils.dev.java.net/
O projeto não está morto não, mas tem arquivos sim, você deu uma olhada no link “Documents & Files” por acaso? Tem uns arquivos por lá… hehehe
flw
Calma!Breve encontrará. Aliás, eu vou ver como arrumar aquele layout lah do java.net.Nós temos logos e ainda não colocamos.
Pessoal(principalmente rafaelRio,dudansk e douglas):
dia 12(outubro) temos mais um daqueles feriados na quinta(que muitas vezes acabam por emendar na sexta…), e gostaria de saber da disponibilidade de vocês em participar de uma reunião online(pode ser Skype,google talk…) para fazermos um mini “HandsOn” com todo mundo testando o código de todo mundo e finalmente marcarmos um release.
Calma!Breve encontrará. Aliás, eu vou ver como arrumar aquele layout lah do java.net.Nós temos logos e ainda não colocamos.
Pessoal(principalmente rafaelRio,dudansk e douglas):
dia 12(outubro) temos mais um daqueles feriados na quinta(que muitas vezes acabam por emendar na sexta…), e gostaria de saber da disponibilidade de vocês em participar de uma reunião online(pode ser Skype,google talk…) para fazermos um mini “HandsOn” com todo mundo testando o código de todo mundo e finalmente marcarmos um release.
Pra mim ok. Dia 14 vou viajar, espero. No dia das crianças eu vou estar em casa. 
Ok! É só marcar.
Bom, dia 12, as 15h via Skype ou ICQ, estará Ok para vcs?
Objetivos da reunião:
Testes das features e determinação do escopo de lançamento da versão 0.1 do projeto.
Como acabei de escrever pro Rafael…
Eu acredito que não vou poder participar não, já que só tenho chegado perto de computador e java no serviço esses últimos tempos. Mas nunca se sabe né, qualquer coisa me mandem via mp o nº de vocês de icq, skype ou outra coisa que vocês forem usar…
Falou, até mais
Tá ok, dudansk.Meu Skype é o meu nick do guj.
Mas devido ao horário do RafaelRio, a reunião será ás 18horas, dia 12.
Dudas, mesmo se você não participar da reunião, não precisa ficar de fora da avaliação da biblioteca.
Você poderia testar as classes, fazer uso delas, quando tiver um tempinho aí no trampo. Depois, manda o resultado das suas impressões pra gente.
T+!
Pessoal, estou desenvolvendo uma APIzinha de validação de alguns itens comuns a nós programadores e impressão de código de barras,q vira e mexe alguem pergunta: como valido cpf?Como valido cnpj?PIS?..
Códigos para CPF,CNPJ,Código de Barras,PIS…entre outros para todos aqueles que necessitam dessas rotinas de validação.
Vá em:
https://brazilutils.dev.java.net/
e participe.
Ou deixe uma msg no nosso blog:
http://brazilutils.blogspot.com/
Boa, posso participar e ajudar a desenvolver essa API tbm??? Tenho uma penca de metodo comum a todos, do dia a dia msm, como Datas e etc…
Curti a ideia 
Dudas, mesmo se você não participar da reunião, não precisa ficar de fora da avaliação da biblioteca.Você poderia testar as classes, fazer uso delas, quando tiver um tempinho aí no trampo. Depois, manda o resultado das suas impressões pra gente.
T+!
Bem, acho que farei isso mesmo, só preciso me lembrar que quando chegar em casa eu devo fazer o download dos arquivos lá, porque daqui não é possível.
flw
http://codingz.info/src/JavaScript%20-%20Inscri��o%20estadual/
Tem uma versão delphi e javascript
–wG @ codingz.info
Heero, toda ajuda é bem vinda!!!
Ponha suas idéias em um txt, veja o que é aparentemente mais útil e que vc consegue fazer.Pegue os códigos que estão lah no CVS, teste-os, é bom para ajudarmos com bugs!
Douglas, estive pensando numa forma de usar suas classes para validar o cadastro de uma inscrição estadual e percebi que é interessante usar Chain of Responsability. Veja só:
String[] ufs = {"RS", "SC", "PR", "SP", "RJ", "MG", "ES"};
String ie = aJTextField.getText();
UF uf;
public boolean validateIE(String ie) {
for (int a = 0; a < ufs.length; a++) {
uf = UF.valueOf(ufs[a]);
if (uf.getInscricaoEstadual().setNumber(ie).isValid()) {
return true;
}
}
return false;
}
Acima temos a forma "tradicional", mais procedural do que orientada o objetos. Usando Chain, fica só um pouco mais complexo, mas bem mais flexível, com as classes mais desacopladas, sabendo menos uma sobre as outras. Primeiro é preciso criar a interface:
public inteface chain {
public void addChain(Chain chain) ;
public void sendMessage(String inscricaoEstadual);
}
Daí, cada classe InscricaoEstadual implementa a interface Chain. Isso é bem simples. Cada InscricaoEstadual tem uma referência para a próxima classe da cadeia, estabelecida por addChain(). Se ela puder validar a inscrição estadual ela retorna true, senão encaminha para a próxima classe na cadeia através de sendMessage(), assim por diante até chegar na última. Se a última IncricaoEstadual não conseguir validar, ela finalmente retorna false.
O que acha?
Não vou dizer nada útil aqui… Era só pro número de mensagens não ser igual a 24! :lol:
Hehehe, essa foi boa…
Mas sobre a corrente ali, nunca tinha visto isso, achei interessante até! Só não sei se a complexidade que é introduzida aí compensa… se bem que não sei o quanto de complexidade seria colocada, já que lendo assim parece fácil de fazer até. Inclusive, todas as classes de validação podem usar esse mesmo esquema quando houver diferença pra cada UF como nesse exemplo.
Flw…
ps: ainda não comecei a ver as classes, estou um pouco enrolado com o serviço por aqui, mas se der um tempo eu dou um jeito aqui e faço uns testes beleza?
Chain é um dos padrões catalogados pela GoF.
Não é difícil implementar nese caso. O método addChain(Chain chain) só ajusta a propriedade nextChain, enquando o sendMessage(String inscricaoEstadual) encaminha a mensagem “valide essa inscrição estadual” para a a próxima classe da cadeia (nextChain) caso ela não tenha sucesso na validação. Assim por diante, até encontrar alguém que consiga validar ou até chegar no fim da cadeia.
Mais algumas vantagens para implementar as classes de validação usando Chain of Responsability, ao invés do modo “tradicional” que é mais procedural:
- O uso das classes não vai ficar mais difícil, e iniciantes em Java não terão problemas, já que a forma mais tradicional também é possível. Esse foi um questionamento que o Iron fez.
- Usuários avançados vão ter bastante flexibilidade no uso das validações, podendo adicionar e retirar classes de validação até em runtime, algo impossível usando loop ou if/else.
- O uso pode até ficar mas fácil para todos. É possível criar e instanciar uma classe de validação, através de um método factory getInstance(), com toda a cadeia já configurada, pronta para uso através de um método valideEssaIncrEstadual(String inscricaoEstadual)
//Instancia-se todas classes de validação de incrição estadual
InscricaoEstadualSP inscricaoEstadualSP = new InscricaoEstadualSP();
InscricaoEstadualRJ inscricaoEstadualRJ = new InscricaoEstadualRJ();
InscricaoEstadualAM inscricaoEstadualAM = new InscricaoEstadualAM();
InscricaoEstadualGO inscricaoEstadualGO = new InscricaoEstadualGO();
// ...
// Assim por diante
// Não liguem para o nome da classe tosco!
private ValidadorDeInscricaoEstadual () {
//Configura a cadeia, inclusive colocando os estados mais utilizados
// na frente para fim de otimização
inscricaoEstadualSP.nextChain(inscricaoEstadualRJ);
inscricaoEstadualRJ.nextChain(inscricaoEstadualAM);
inscricaoEstadualAM.nextChain(inscricaoEstadualGO);
}
// Factory
public static ValidadorDeInscricaoEstadual getInstance() {
return new ValidadorDeInscricaoEstadual;
}
public boolen valideEssaIncrEstadual(String iE) {
// Só encaminha a mensagem para o primeiro da cadeia e espera
// a resposta.
return inscricaoEstadualSP.sendMessage(iE);
}
Ou, ao invés de ter um factory para instanciar um objeto dessa classe para só então usar o método valideEssaIncrEstadual(String inscricaoEstadual), esse método poderia ser static.
Corrigindo a interface Chain:
public inteface chain {
public void addChain(Chain chain) ;
public boolean sendMessage(String inscricaoEstadual);
}
Douglas, você tinha pedido sugestões porque está para fazer mudanças nessas classes. Não tinha pensado em nada ainda. Já faz um tempinho que estava pensando numa ótima maneira de usar as classes de validação e acho que essa pode ser uma delas.
T+!
Dudaskank, quando vc “desafogar” o serviço me dá um toque por email que eu quero discutir um pouco o pack de métricas com você.
RafaelRio, vá pensando/reformulando o que vc tá fazendo, pois essa discussão com o Douglas vai ter que esperar.Ele está lá nas praias do Nordeste curtindo as férias até fins de outubro…
2 exemplos de implementação de chain:
-
o mecanismo de herança (procura por um método na classe mais abaixo na hierarquia, subindo até encontrá-lo, ou não);
-
e a implementação dos filters para servlets:
doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
RafaelRio, o douglas té lendo o tópico espero que ele responda suas dúvidas logo.
Thingol, gostaria que vc botasse aqui, os detalhes básicos sobre como implementar criptografia com Bouncy Castle.O Rafael vai estudar a viabilidade de fazer uma classe assim.Se vc tiver algo/idéia pronta pode postar também.
[b]Fernando Meyer/b até hoje vc não me deu por escrito como seria aquela sua idéia sobre classes de datas.Poste os detalhes aqui.
Vamos tentar dar um gás agora, e fazer um mini-release no próximo mês, já atrasamos demais, parece a linha 3 do metrô do rio! :lol:
Companheiros,
Pesquisei neste tópico se já havia post de código de formatação de CEP. Como não encontrei estou enviando. Espero ser útil.
Ah, ele vai junto de um teste de aceitação.
package br.com.lello.test.vo;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
import junit.framework.TestCase;
public class TestFormatador extends TestCase {
public void testFormataCEP1() {
assertEquals(frmt("4304-10"), "04304-010");
assertEquals(frmt("04304-210"), "04304-210");
assertEquals(frmt("4-8"), "00004-008");
assertEquals(frmt("04304-010"), "04304-010");
assertEquals(frmt("504304-010"), "504304-010"); //invalido, mas passa
assertEquals(frmt("04304010"), "04304-010");
assertEquals(frmt("0430401"), "04304-001");
assertEquals(frmt("01"), "00001-000");
}
private String frmt(String s) {
String r;
Double c1, c2;
String [] splitted;
DecimalFormat df1 = new DecimalFormat("00000",
new DecimalFormatSymbols(new Locale("pt", "BR")));
DecimalFormat df2 = new DecimalFormat("000",
new DecimalFormatSymbols(new Locale("pt", "BR")));
if (s == null) {
return "";
}
if (s.indexOf('-') == -1) {
int tam = s.length();
int i1 = (tam > 5 ? 5 : tam);
int i2 = (tam > 8 ? 8 : tam);
c1 = Double.valueOf(s.substring(0, i1));
if (i2 > 5) {
c2 = Double.valueOf(s.substring(6, i2));
} else {
c2 = new Double(0);
}
} else {
splitted = s.split("-");
c1 = Double.valueOf(splitted[0]);
c2 = Double.valueOf(splitted[1]);
}
r = df1.format(c1);
r += "-";
r += df2.format(c2);
System.out.println(s + "\t -> " + r);
return r;
}
}
Chain é um dos padrões catalogados pela GoF.Douglas, você tinha pedido sugestões porque está para fazer mudanças nessas classes. Não tinha pensado em nada ainda. Já faz um tempinho que estava pensando numa ótima maneira de usar as classes de validação e acho que essa pode ser uma delas.
T+!
Pessoal, perdoe a minha ausência nesse período, já nem sei mais que dia da semana é pq estou trabalhando direto. Vou tentar dar uma atenção maior ao projeto.
Rafael,
Eu entendi o que é o padrão, mas acho que você poderia colocar um exemplo usando as próprias classes que estão no pacote de inscrição estadual. Acho que a utilização desse padrão não inviabiliza o que já está lá. Só tenho uma questão: como uma classe de IE vai saber que um número de IE é inválido por não se daquele estado ou porque é inválido mesmo? Se eu entendi bem, um número de IE só será considerado inválido após ser invalidado pelas 27 classes. Correto?
Companheiros,Pesquisei neste tópico se já havia post de código de formatação de CEP. Como não encontrei estou enviando. Espero ser útil.
Felipe,
Existe uma classe chamada Cep no pacote org.brazilutils.br.endereco.
Não entendi exatamente o que significa formatar 4-8 para 00004-008. Normalmente eu vejo muito em sistemas formatação de 5 para 8 caracteres, o que normalmente se faz adicionando três zeros ou consultando alguma base de dados.
Em que casos se usa essas formatações que você postou? Pode-se adaptar a calsse de Cep adicionando parte desse código que você fez.
Douglas, beleza? Quanto tempo!! Deu até saudades! :lol:
A idéia não é inviabilizar o que já está feito, de forma alguma. É acrescentar ao que você já fez. Não postei nenhum exemplo com base direta nas suas classes porque queria ouvir a sua opinião antes.
Tinha pedido pro Iron me adiantar alguma tarefa pro BrazilUtils a umas duas semanas atrás, já que estava meio parado (eu e o BU! hehe). Assim que tiver um tempinho de novo, posto aqui alguma coisa.
Não vai saber. A palavra chave desse padrão é delegação. Não cumpriu sua tarefa (nesse caso a validação) manda pro próximo da cadeia.
Depende. É por isso que existe o método addChain (vide exemplo acima). Se eu colocar apenas duas classes de validação na cadeia, se a IE for inválida para os dois estados representados pela classe, ela será invalidada após ser testada apenas pelas duas classes.
Se colocar seis classes (São Paulo, Rio, Paraná, Amazonas, Ceará, Mato Grosso), se a IE for inválida para todos os estados, retorna após a execução do teste pelas seis classes que estão na cadeia.
Ok ?
Depende. É por isso que existe o método addChain (vide exemplo acima). Se eu colocar apenas duas classes de validação na cadeia, se a IE for inválida para os dois estados representados pela classe, ela será invalidada após ser testada apenas pelas duas classes.
Se colocar seis classes (São Paulo, Rio, Paraná, Amazonas, Ceará, Mato Grosso), se a IE for inválida para todos os estados, retorna após a execução do teste pelas seis classes que estão na cadeia.
Ok ?
Acho que compreendi como usar o padrão. A delegação fica a cargo do usuário da API não da própria API. Vc cria umas IEs e junta as que vc precisar. Passa um número pra primeira e as outras são acionadas em seguida. Mas a fila de IEs é definida pelo uauário através de addChain() ou coisa do tipo.
Exato.
Note que as classes de validação ainda poderão ser usadas sozinhas, sem fazer parte de uma corrente.
E deve ser tranqüilo implementar a Chain nesse caso. O mais difícil você já fez, que é a lógica de validação.
É só defenir e implementar a interface chain, e colocar uma condicional no método de validação da classe.
Conseguiu validar? Se sim, retorna ok. Se não conseguiu, verifica se tem alguém na corrente. Tem alguém na corrente? Delega então para essa classe. Caso contrário, retorna IE inválida.
A interface:
public inteface chain {
public void addChain(Chain chain) ;
public void sendMessage(String inscricaoEstadual);
}
O que acha?
Com polimorfismo isso fica fácil, fácil.
Por que não usar o commons-chains?
Porque, nesse caso, seria como querer matar uma mosca com um canhão. 
Não acho que o commons-chains seja tão grande ou complexo assim.
Pq seria um canhão?
Veja bem, eu não julguei o Commons-Chains.
Não vejo vantagem alguma em usá-lo nesse caso. E quanto mais simples a forma de se resolver um problema, melhor.
Mas, flaleite, se você estiver disposto a argumentar sobre as vantagens de se usar Commons-Chains nas classes de validação de IE e, se possível, ainda mostrar algum código de exemplo, por favor fique a vontade.
Isso só vai somar, seria muito bom!
flaleite,
o problema de começarmos a usar APIs anexas a nossa(criar dependências), é que isso pode virar uma bola de neve, e isso é um perigo numa API de validação como a nossa!
Até então, a única que eu tinha idéia de usar é a BouncyCastle, mas não estou seguro…
Ironlynx,
Compreendo…
desculpe a pergunta, mas como faco pra chamar uma classe deste pacote pra validacao de cpf …
to usando o eclipse e ja dei um import externals jar no meu projeto e um import org.brazilutils.* no meu fonte …
tem que passar algum parametro ???
porque tenho o que o usuario digitou num jtextfield (no caso, o cpf) com a mascara numa string …
marcoscorso, me desculpe pela demora!
Logo, o Ironlynx e o dsiviotti vão me bancar ($$$) para trabalhar no BrazilUtils em tempo integral, daí as respostas vão passar a ser instantâneas! * :lol:
Certifique-se que a classe CpfCnpj está no namespace da classe. Importa org.brazilutils.br.cpfcnpj.CpfCnpj ou org.brazilutils.br.cpfcnpj.*.
Instancia um objeto da classe CpfCnpJ e use os métodos setCpfCnpj, isValid, isCnpj, isCpf.
private CpfCnpj validator = new CpfCnpj();
validator.setCpfCnpj("[telefone removido]");
validator.isValid();
validator.isCnpj();
validator.isCpf();
Iron, você conseguiu resolver esse problema ? http://www.guj.com.br/posts/list/48129.java
- Brincadeirinha! Mas vou tentar responder mais rápido…
Aliás, uma coisa que estava pensando.
Quando lançarmos a primeira versão do BrazilUtils, vai ter uma aviso dizendo que as próximas versões provavelmente não serão compatíveis?
Ironlynx, dsiviotti, se vocês disserem que não, eu começo a chorar agora!
Tem uma biblioteca muito boa - a TimeAndMoney (http://timeandmoney.domainlanguage.com/) - que deixa bem claro que pode haver problemas de compatibilidade entre as várias versões da API, simplesmente porque pacotes e classes deixam de existir, ou mudam de lugar, conforme a TimeAndMoney evolui.
Para manter a compatibilidade entre as versões do BrazilUtils, não poderíamos mexer na estrutura do projeto, o que seria um sacrifício enorme para nós e para a qualidade do TiUzão.
Um exemplo: acho que deveríamos mudar o modo como validamos Cpf e Cnpj. Para mim, não deveria existir uma classe CpfCnpj, já que Cpf e Cnpj tratam de coisas (domínios) diferentes. E muito menos ter outras classes Cpf e Cnpj mais abaixo na hierarquia, o que confunde bastante. E isso fica ainda mais embananado se considermos que, para fazer validação tanto de Cpf, quanto de Cnpj, usa-se a classe CpfCnpj!
Supondo que fique tudo inalterado, não teríamos a liberdade de fazer mudanças estruturais importantes que eventualmente possam ser necessárias.
No caso citado acima, extrair todo o código comum para validação de Cpf e Cnpj para uma superclasse, digamos NumerosFiscais, e concentrar funcionalidades específicas para a validaçao de Cpf e Cnpj respectivamente nas classes de mesmo nome, Cpf e Cnpj, que extenderiam NumerosFiscais.
Não, vou te responder lá…
Mas bem que eu gostaria de dar um incentivo($$$) pro pessoal, mas lamentavelmente tá difícil até para mim…
Vc descobriu o principal motivo pq ainda não houve um oficial release até o momento, e o porquê de estar buscando um PM(ProjectManager) beem experiente. Há pontos(leia-se features) incompletas, “que não fecham”, e cuja estrutura tem que ser repensada.Gerar incompatibilidade a cada release é pedir para não usarem a API.Não há como.
Como API de validação, há sempre uma tendência imediatista, de pensar no resultado, ou seja, tá funcionando, passa.Mas sabemos que isso não é bem assim, e não basta fazer um apanhado de códigos e lançar uma versão.
Rafael, cuidado com uma coisa:prefira composição a herança, e veja se é tão necessário assim existir essa classe de números fiscais, se o comportamento é comum…
Gerar incompatibilidade a cada release é pedir para não usarem a API.Não há como.
Não concordo, e por isso citei a TimeAndMoney como exemplo. Mesmo porque não dá pra imaginar todas as features possíveis que uma API pode ter, muito menos como elas funcionarão. E tem esse ponto também, da velocidade do lançamento.
Ironlynx, na boa…
Você não viu as classes CpfCnpj, Cpf e Cnpj do pacote org.brazilutils.cpfcnpj, não é mesmo?
Eu tô falando isso justamente pq eu vi… :shock: :lol:
(Eu ia responder ao marcoscorso, mas vc postou antes, quando eu li eu vi o problema do NumberComposed…)
Por isso a organização dos packs faz toda a diferença nessa hora…
Features novas(não relacionadas) entram em packs novos, logo não há problemas de retrocompatibilidade…
Nosso problema é estruturar as antigas…
Sobre a questão da Chain.
O usuário da classe pode saber exatamente qual o estado da inscrição estadual (IE) que quer validar. Então,UF AC = UF.valueOf("AC"); // Cria a UF a partir da Sigla
AC.getInscricaoEstadual().setNumber("01.004.823/001-12");
AC.getInscricaoEstadual().isValid();
Para os casos em que a IE pode ser de mais de um estado, usa-se a cadeia (pelos motivos já citados anteriormente).
Precisamos de mais uma interface. Que tal ChainValidator? Sei lá, o nome das minhas classes, interfaces e packages sempre me lembram as Organizações Tabajara!
A classe InscricaoEstadual implementa a interface Validable. Validable poderia extender ChainValidator, o que teria um efeito cascata nas classes do TiUzão. Aqui, InscricaoEstadual implementa ChainValidator.public inteface ChainValidator {
public void addValidator(ChainValidator validator) ;
public boolean validate(String inscricaoEstadual);
}
private ChainValidator nextValidator;
public void addValidator(ChainValidator nextValidator) {
this.nextValidator = nextValidator;
}
public boolean validate(String inscricaoEstadual) {
setNumber(inscricaoEstadual);
if (isValid()) {
return true;
} else if (nextValidator == null) {
return false;
}
return nextValidator.validate(inscricaoEstadual);
}
Continuando…
Tive que alterar os métodos isValid() para que a cadeia funcionasse. É fundamental chamar o método defineCoeficients() antes de qualquer coisa nos métodos isValid().
Também eliminei o método genericValidation() e, conseqüentemente isUseGenericValidation() deixou de existir. Ao invés disso, InscricaoEstadual implementa isValid(), que deixou de ser abstrato, e, quando outras classes precisarem usar uma validação específica, elas sobrepõem (override) isValid().
Sessão de perfumaria: também alterei o escopo de vários métodos para protected e private. Claro que tudo isso são sugestões. Vejam o que serve e o que não serve.
O importante é que funcionou direitinho. 8)
Agora sobre as classes de validação de cnpj (pacote org.brazilutils.br.cpfcnpj).
É melhor fazer logo e mostrar o que estou pensando do que ficar divagando.
Para deixar bem claro, a única coisa que fiz nesse pacote foi um refactoring nas classes, movendo algumas coisas para baixo na hierarquia (o que é mais específico de cada subclasse), implementando o padrão Template (GoF) e renomeei a classe CpfCnpj, que passou a se chamar NumeroFiscal. Não mexi no algoritmo de validação, que está ok.
Tudo isso, de novo, são sugestões. Avaliem se é útil.
Benefícios:
- métodos isCnpj() e isCpf() não são mais necessários;
- eliminação de flags isCpf, isCnpj;
- mais fácil de entender: cnpj é cnpj, cpf é cpf.
Desvantagens:
- alguma duplicação de código, pelo fato dos algoritimos de validação de Cpf e Cnpj serem parecidos. (Douglas, foi por isso que você criou uma classe CpfCnpj, não foi?)
Seguem as classes NumeroFiscal, Cpf e Cnpj.
CpfCnpj c = new CpfCnpj();
c.setCpfCnpj("29520590000165");
c.isValid(); // CNPJ valid
c.isCnpj(); // is CNPJ
c.isCpf(); // is not CPF
c.setCpfCnpj("[telefone removido]");
c.isValid();// CPF invalid
c.isCnpj(); // is not CNPJ
c.isCpf(); // is CPF
Cnpj cnpj = new Cnpj();
cnpj.setCnpj("29520590000165");
cnpj.isValid();
Cpf cpf = new Cpf();
cpf.setCpf("[CPF removido]");
cpf.isValid();
getModule11Dv(String number, boolean isCpf)
getModule11Dv(String number)
Tanto no caso das classes de validação de inscrições estaduais, quanto nas classes de Cpf/Cnpj, há outras mudanças que não citei. Algumas são perfume, outras são mais importantes.
Abraço a todos! Feliz Natal, galera! :D
RafaelRio(tava inspirado hein?), eu e o Douglas já estamos lendo as suas classes, depois lhe damos um feedback!
Foi o espírito natalino. 
Qual a nova data de lançamento?
Discuta isso comigo no email, pq o Douglas tá enrolado no CadFuncNadQualquerCoisa lah do Serpro.
Existe um problema prático que depois de desenvolver muitos sistemas acabei antecipanto na classe CpfCnpj. Ela não existe apenas pra ter código em comum e depois ter uma Cpf e uma Cnpj. Na verdade, na maioria dos casos, você não sabe exatamente se vai ter um Cpf ou um Cnpj! Isso complica bastante a equação. Por acaso o algorítimo é semelhante e pode ser usado um só.
Em muitos casos, um objeto CpfCnpj que inicialmente era um Cpf vira um Cnpj! Assim você até pode ter classes de Cpf e Cnpj para os casos onde essa “mutaçao” não é possível, mas ela acontece. Logo, o quanto mais código na superclasse, que não pode ser abstrata, melhor. O mesmo vale pro método estático que faz a validação do número. Ele deve estar preparado pra receber um (11) ou outro (14). Na verdade, há algum tempo tenho me questionado sobre a existência dessas classes da forma como estão. Acho que o método estático que valida os números é o que 99% das pessoas precisa. E da forma que está não serve pro 1% restantante. Acho que essas exceptions de Validation devem sair.
Quanto às alterações na Inscrição Estadual ficaram ótimas. Principalmente porque não altera o que já estava feito. Se for garantido a opcionalidade de usar essa validação em cascata fica ótimo.
Discuta isso comigo no email, pq o Douglas tá enrolado no CadFuncNadQualquerCoisa lah do Serpro.
Pô Ironlinx, é CadSincNac - Cadastro Sincronizado Nacional. Aliás, por ironia do destino, em breve o termo CNPJ, provavelmente, será substituído por algo assim. Já que o Cadastro Nacional de Pessoas Jurídicas vai ser incorporado pelo Cadastro Sincronizado Nacional. Os nomes das classes já podem estar caducos! rs
Por falar nisso, os números de CNPJ que tem 0001 no final não são mais, necessariamente, a matriz. Muitas rotinas verificam o número do CNPJ procurando esse "0001" no fim pra saber se a empresa é matriz. Já não é mais assim. (boa sorte)
Minha equipe (de 4 pessoas!!) está com 2 de férias e os prazos você já conhece! Se alguém quiser fazer como o Renato, e dar uma olhada e criticar o pacote "br", é uma boa! Sempre que puder eu respondo aqui alguma dúvida. Código novo, como o do "chain" é bem vindo também.
Uma coisa que deveria ser escrita é uma clase de teste para cada Inscrição estadual validando um número considerável de IEs de cada estado. Algumas certas e outras erradas. Eu segui os algorítimos do Sintegra mas alguma coisa pode ter mudade desde então.
http://www.sintegra.gov.br/ clique em "Informações Gerais -> Inscrições Estaduais"
Discuta isso comigo no email, pq o Douglas tá enrolado no CadFuncNadQualquerCoisa lah do Serpro.
Estou esperando o seu e-mail.
Em muitos casos, um objeto CpfCnpj que inicialmente era um Cpf vira um Cnpj!
Pensou depurar ou fazer a manutenção de um software que conta com esse tipo de comportamento? Como diz a Ritinha, obrigado não!
Assim você até pode ter classes de Cpf e Cnpj para os casos onde essa “mutaçao” não é possível, mas ela acontece.
E como fica o paradigma de responsabilidade bem definida das classes, um dos pilares da OO? Não se trata de purismo. Levei muito tempo para descobrir o que no algoritimo era referente à CPF, o que era à CNPJ. Dei sorte de não ter quebrado seu algoritimo de validação CNPJ/CPF.
Para os casos em que poderá ser manipulado tanto CPF quanto CNPJ, pode-se ter uma espécie de controlador decidindo para quem despachar as mensagens - a classe CPF ou CNPJ. E Chain of Responsability também é aplicável nesse caso, da mesma forma que na IE.
É possível resover esse problema de várias formas. Temos que ficar justo com a solução de misturar tudo numa classe só?
Cadastro Sincronizado Nacional. Aliás, por ironia do destino, em breve o termo CNPJ, provavelmente, será substituído por algo assim.
Pois é! Imagina se resolverem mudar a forma de validar CNPJ. Poderia quebrar o algoritimo de validação de CPF, que não tem nada a ver com a história.
Gerar incompatibilidade a cada release é pedir para não usarem a API.Não há como.
Os nomes das classes já podem estar caducos!
Fiquei curioso. Como vamos lidar com casos assim no futuro?
Quem?
2006 já era!
Feliz ano novo galera!
*** clicado “citar” no lugar de “editar”. perdão!
???
Apenas um up, é isso mesmo?
???Apenas um up, é isso mesmo?
Relaxa, cara! 8) Essa thread nem precisa disso.
***
Mas o que seria isso?
As mudanças que conversamos para as classes do pacote org.brazilutils.br.uf.ie já foram passadas (commit) para o repositório. Verifiquem!
Modificações além das que já havia postado:
Tirei os System.out.println do código.
Tirei comentários com código antigo.
Mexi na formatação.
Transfomei todas as subclasses de InscricaoEstadual em final (favorecendo segurança e performance).
Dever de casa (Douglas):
Passar código-fonte do Java 5 para Java 1.4. 
Vários TODO - Verificar máscara
Fazer um tutorialzinho sobre as nuances de InscricaoEstadualRO
Testes:
Incluí testes para a validação em cadeia na classe UFInscricaoEstadualTest.
Claro, testar a validação das demais subclasses de IncricaoEstadual (Possível somente no dia-a-dia dos usuários).
O que adorei:
O método genericValidation já era. Classes que usam validação genérica chamam isValid, definida na superclasse InscricaoEstadual.
Douglas, parabéns pelas classes de validação de Inscrição Estadual. Dá pra ver que deu trabalho fazer e, claro, funcionam!
E me posicionem sobre a questão da validação de CPF/CNPJ. Se já tivessem decidido, elas já estariam prontas.
Atualmente existe a classe CpfCnpj que concentra os códigos de validação de uma ou outra coisa. Ao instanciar um objeto dessa classe, este objeto pode ter comportamento de uma ou outra. Pode iniciar como um e transformar-se em outra. Isso, de fato, acontece. Mas se vc quiser, no seu sistema, usar tudo bem separado desde o início pode usar o código como você postou com as classes novas mesmo usando as que já estão lá.Basta usar as classes Cpf e Cnpj seperadamente. Por isso elas existem. Ao declarar e instanciar um Cpf ele sempre será Cpf, idem pro Cnpj. Mas no caso “mutante” deve-se declarar e talvez instanciar um CpfCnpj. Essa possibilidade não é possível na implementação nova. Os flags a mais dentro do algorítimo de validação são um custo baixo pra quem tem o problema da “mutação”. isCpf() e isCnpj() podem, obviamente, ser ignorados se você estiver usando as classes especializadas Cpf e Cnpj, mas no caso de indeterminação eles ajudam bastante.
Acho que pra primeira distribuição deve-se retirar o pacote validation que tá obriganto classes como CpfCnpj, Ie e etc implementar como num framework. Isso tá meio forçado (da minha parte na época) pro usuário da API.
Esse dever de casa não é nada mole. Tem uns enuns pra substiruir. Isso significa que a forma como se usa essa classe muda pelo código. Já passei por isso este ano e não é nada agradável. Porém, atendendo a pedidos, eu refiz as classes UF e TelMask de forma que os pacotes UF (UF e inscrições estaduais) e Telefone estão já compatíveis com 1.4. O mesmo vale pro pacote cpfcnpj. Fica faltando o de endereço que acho que um erro de projeto. O Enum TipoLogradouro não deveria ser uma lista “chapada” em código e sim um arquivo xml acoplado. A lista que tá lá, tá caduca e a normalização tem que ser melhorada antes de ser liberada.
O pacote ID deve ser excluído já que era apenas uma idéia que ninguém comprou e implementou as classes. Assim, acho que pra primeira versão pode-se ignorar o pacote endereço (por enquanto) e deletar de vez o pacote id que não acredito vá fazer sentido.
O Enum UF pode ser um dia substituído por xml também, mas nesse caso como são só 27 e uma mudança nisso implica, de qualquer forma, em impacto em código acho que pode ficar assim.
Já dei commit no “dever de casa”, tinha inclusive coisa pra alterar na classe “Inscrição Estadual”, era uma List com Generics que eu tirei. Recomendo que os Generics que já estão no código sejam simplesmente comentados pra no futuro serem postos de volta.
Por incrível que pareça eu rodei o teste escrito há séculos e ele rodou!
Acho que pra primeira versão, o pacote “br” deve incluir só o seguinte:
pacote cpfcnpj - com classes de Cpf e Cnpj
pacote telefone - com as classes de telefone
pacote uf- com a classe de UF e as de Inscrição estadual.
Mas ainda acho que se pode retirar também o pacote “validation” e as referencias a interface Validable e GenericValidation. Essa amarração não é necessária.
Rafael, dê uma olhada na classe UF como ficou agora e veja se o padrão chain não pode ser aplicado lá também. Aliás, como uma UF tem internamente uma Inscriçao Estadual, talvez seja nela que esse padrão deva ser implementado, não sendo necesário que as IEs tenham referência umas pras outras, mas é só um palpite. Você pode dizer melhor o que fazer sobre isso.
Porém, atendendo a pedidos…
Espero que tenham sido muito pedidos!!!
Assim, acho que pra primeira versão pode-se ignorar o pacote endereço (por enquanto)…
Justo o pacote de meu maior interesse! :shock:

Então vamos lançar logo a primeira versão para eu começar a colocar as minhas mãos no pacote de endereço. Douglas, você me dá uma força, não é?
Mas ainda acho que se pode retirar também o pacote “validation” e as referencias a interface Validable e GenericValidation. Essa amarração não é necessária.
Vou deixar isso pra você porque não entendi exatamente o que deve ser feito.
Rafael, dê uma olhada na classe UF como ficou agora e veja se o padrão chain não pode ser aplicado lá também.
Qual motivo pra isso? Não consegui enxergar nenhum.
Aliás, como uma UF tem internamente uma Inscriçao Estadual, talvez seja nela que esse padrão deva ser implementado
Acho melhor deixar como está, nas subclasses de InscricaoEstadual. Aliás, ía até sugerir para você retirar as validações de CEP e placas de automóveis da UF (o que não faz mais sentido depois das suas mudanças).[/quote]
Mas se vc quiser, no seu sistema, usar tudo bem separado desde o início pode usar o código como você postou com as classes novas mesmo usando as que já estão lá.
Não entendi o que fazer com as classes de CPF/CNPJ. Deixa como está?
T+!
Como eu disse anteriormente, o enum TipoLogradouro deve ser substituído por uma classe e os dados por um arquivo XML. Não é só esse. O de municípios, países e UFs também. Tenho trabalhado diretamente com esses padrões de endereço desde janeiro do ano passado. O pacote de endereço está meio desatualizado. Depois que sair a primeira versão podemos reiniciar a implementar esse pacote. Posso adiantar que tem muitas funcionalidades que atualmente não são contempladas. Acabei trabalhando em um código em java que é baseado nesse só que com um ano de evolução e acesso a realidades práticas e problemas de sistemas que têm nos endereços uma informação chave. Acredito que a forma como esse pacote vai ficar vai contemplar do sistema mais simples ao mais complexo. Pra isso eu preciso liberar algum tempo, se tiver ajuda melhor ainda.
O código que você postou como sendo a nova proposta é totalmente possível com as classes como estão. Por isso acho que não é necessário trocar agora. Se numa segunda versão fizermos as alterações que você sugeriu este código não se altera em nada. A diferença é que neste código chama-se setCpf() e setCnpj(), poderia ser um mesmo para ambas as classes como setNumero().
Cnpj cnpj = new Cnpj();
cnpj.setCnpj("29520590000165");
cnpj.isValid();
Cpf cpf = new Cpf();
cpf.setCpf("[CPF removido]");
cpf.isValid();
Além disso, como já havia dito, a proposta de novas classes tem que contemplar as situações de Cpf e Cnpj que não são pré definidas. Acho que na primeira versão elas deveriam ficar como estão, ou talvez aquele método único de set para ambas as classes.
Bem, estamos quase lá (versão 0.1).
Eu tenho escrito no meu blog anotações, inclusive sobre a API BrazilUtils, porque sempre que passa um tempo, eu acabo esquecendo muita coisa que fiz, ou aprendi, e depois demoro um tempão re-descobrindo tudo.
Daí, melhor do que escrever nos meus cadernos ou no Open Office é deixar num blog, porque, se serve pra mim, pode servir pra outros.
Escrevi sobre a validação de Inscrição Estadual e a validação em cadeia e sobre como passar valores monetários por extenso, entre outros assuntos.
Eu estou aprendendo a usar as classes do pacote org.brazilutils.br.telefone, então provavelmente esse será o próximo assunto.
Portanto, Iron, Douglas, feedback!
Depois que sair a primeira versão podemos reiniciar a implementar esse pacote. Posso adiantar que tem muitas funcionalidades que atualmente não são contempladas. Acabei trabalhando em um código em java que é baseado nesse só que com um ano de evolução e acesso a realidades práticas e problemas de sistemas que têm nos endereços uma informação chave. Acredito que a forma como esse pacote vai ficar vai contemplar do sistema mais simples ao mais complexo.
Óteeemo!
Será que alguém pode me explicar porque não consegui postar uma imagem aqui no GUJ? :roll: Tentei + ou - assim ->
[abre tag img]http://bp2.blogger.com/_KYeHnrXYwPg/RZ2d9pBtXlI/AAAAAAAAAFM/QxVhqsUGc90/s1600-h/chain_of_responsability.png[fecha tag img]
Valeu!
Rafael,
Estava dando uma olhada nas clases de Inscrição Estadual e vi que todas elas ganharam um atributo nextValidator que é onde é guardado o próximo validador a ser chamado. Esse atributo não poderia estar na classe InscricaoEstadual como “protected”? Talvez até como “private” com os métodos implementados somente na classe InscricaoEstadual já que são todos idênticos. Ao invés de ter 27 métodos idênticos nas classes filhas teria só um na classe mãe.
Talvez até como “private” com os métodos implementados somente na classe InscricaoEstadual já que são todos idênticos.
Sim, bem melhor.

Sabe como é, fiz depos do Ano Novo! Ainda estava lento… :lol:
Ao invés de ter 27 métodos idênticos nas classes filhas teria só um na classe mãe.
Essa vai entrar na categoria “Oh meu Deus! Eu fiz isso!”. :lol:
Pode deixar que eu refaço tudo.
Tem uma coisa que está me incomodando. O método isValid sempre precisa chamar defineCoeficients. O problema é que sempre que isValid é redefinido, é preciso lembrar de chamar defineCoeficients.
public boolean isValid() {
// Necessário para que a cadeia de validação funcione.
defineCoeficients();
int sum; // Sum of Multiply (Digit * Peso)
int mod; // Module in sum % 11 or sum % 10
int dv1; // Fisrt Calculated Chek Digit
// If the Digit Count is not correct, return false
if (!isValidDigitCount()) {
return false;
}
// Calculate the Check Digit
sum = getCalcSum();
mod = sum % 11;
if (mod <= 1) {
dv1 = 0;
} else {
dv1 = 11 - mod;
}
// Returns Calculated Chek Digit = The Real Check Digit
return dv1 == getDv1();
}
Só esse comentário já mostra que a coisa não está tão legal assim. Dá pra resolver isso com Template, mas vai deixar as classes um pouco mais complexas, o que não é legal.
Como dificilmente alguém vai criar novas subclasses de InscricaoEstadual, e todas as que já existem são final, não sei se vale a pena mexer. O que acham?
Acho que NÃO vale a pena mexer.
Vamos marcar um skype no FDS para discutirmos?
Acho que NÃO vale a pena mexer.
Vamos marcar um skype no FDS para discutirmos?
Por mim tudo bem. Devo estar trabalhando mesmo. Se vai ser liberado algo no dia 22 já é bom gerar o jar e fazer testes. Quando às alterações nas classes, acho que a prioridade gerar uma versão.
Douglas, uma dúvida!
Não ficou bem claro pra mim, se alguma coisa das classes referentes à validação de CPF E CNPJ que eu modifiquei vão ser aproveitadas para as próximas versões.
Ou as classes CpfCnpj, Cpf e Cnpj não precisam de mudanças?
[Editado]
Porque se tiver que fazer alguma coisa nelas, eu posso ver isso enquanto você e o Iron estão cuidando dos testes.
Falandio nisso, como vão os teste? Tá chegando…
[/Editado]
Os do Douglas eu ainda não sei, o meu deu uma atrasada pq o site que eu usava para comparar não está mais no ar e eu uso outros 2 agora para isso.
Os do Douglas eu ainda não sei, o meu deu uma atrasada pq o site que eu usava para comparar não está mais no ar e eu uso outros 2 agora para isso.
Se não estivesse atrasado teria algo errado. Minha definiçao de “prazo” se tornou muito singular nos últimos meses.
No domingo devo disponibilizar os testes.
Opa, cai de para-quedas aqui :lol: . Eu estou tentando utilizar a API de vocês aqui e me deparei com a seguinte situação: quando eu passo o CNPJ 06124268000111 para o método de validação Cpf.isValid(CNPJ) eu obtenho true como resposta, ou seja, está validando o número :!: . Agora, quando eu tento criar um objeto da classe Cpf passando o mesmo CNPJ (Cpf cpf = new Cpf(CNPJ)) o método lança uma ValidationException.
Isto é para acontecer ou estou utilizando a API de você forma incorreta (ou os dois quem sabe)?
Grato pela atenção!
Fischer
Fischer ,
Eu nao entendo desta API, mas tu ta tentando criar um CPF com um numero de CNPJ?
]['s
Sim, eu fiz isso propositalmente. Acho meio estranho: o método Cpf.isValid(String cpfOrCnpj) validar tanto CPF como CNPJ, mas se você tentar criar uma mesma instância da classe Cpf passando um CNPJ lança exceção.
Não quero discutir com os criadores da API se isso é certo ou não (se é que existe a forma certa ou a errada), quero apenas saber qual a melhor forma de utilizar a API para que só valide se for passado um CPF para validação.
No momento estou utilizando o contrutor da classe Cpf para isso e tratando a exceção.
Fischer
Fischer, você pode saber melhor o que está acontecendo aqui: http://www.guj.com.br/posts/list/405/20643.java. Veja a partir da terceira mensagem. Ainda estamos discutindo o que fazer com as classes de CNPJ e CPF.
Você poderia contribuir com sua opinião.
Ow, fala galera, to precisando de uma validação de nome, vai ser de um sistema que faz consulta no serpro se ninguém tiver essa validação depois eu adiciono no projeto.
A Validação é a seguinte:
"O nome contiver uma parte abreviada com apenas uma letra, exceto E nas entrepartes ou I como a última parte do campo;
O nome conter mais de 2 letras iguais consecutivas, exceto a letra “III”;
Parte do nome conter mais de 20 letras;
Inscrito com as seguintes palavras: NOME, IGNORADO (A), CONSTA, CONTÉM, INFORMADO (A), NÃO DECLARADO (A) E SEM INFORMAÇÃO.
Nome com apóstrofo. (Na tela exibe apóstrofo, porém no momento de gravar no banco, exibe espaço em branco;
"
Se alguém tiver já pronto agradeço!
Consulta no Serpro???Douglas, se apresente ao tópico! 
Opa, cai de para-quedas aqui :lol: . Eu estou tentando utilizar a API de vocês aqui e me deparei com a seguinte situação: quando eu passo o CNPJ 06124268000111 para o método de validaçãoCpf.isValid(CNPJ)eu obtenho true como resposta, ou seja, está validando o número :!: . Agora, quando eu tento criar um objeto da classe Cpf passando o mesmo CNPJ (Cpf cpf =new Cpf(CNPJ)) o método lança uma ValidationException.
Isto é para acontecer ou estou utilizando a API de você forma incorreta (ou os dois quem sabe)?Grato pela atenção!
Fischer
Olá. Creio que já esteja resolvido esse problema. As classes CPF e CNPJ sobreescrevem o método isValid() e só testam se o tamanho for correto. Se você passar um CNPJ em
CPF.isValid() vai ter retorno false.Bom, foi lançada essa versão 0.1, beem enxuta até pq algumas features ainda não foram testas, mas se encontrarem problemas/dúvidas/sugestões é só irem postando pessoal! 
link para download:
https://brazilutils.dev.java.net/files/documents/3026/51503/brazilutils-0.1.jar
Bug report: Suffix eh com dois “f”.
Anotado. 
Pessoal, nós lançamos o release agora mais para estimular ao pessoal a contribuir e a participar do projeto.Conforme foram passando nos TestCase, fomos adicionando as features.Mas há muito já para ser adicionado e se tiverem idéias, é só irem postando.
Detalhe: sempre que quiserem me mandar uma idéia/feature já implementada, mandem com um Testezinho associado que ajuda muito!
Fala galera tudo belezinha?
Meu nome é Luiz conhecí o BrazilUtils um tempo atrás, até me inscreví no projeto, mas como tive muita correria no meu trabalho fiquei de fora e agora através de um tópico no guj ví que haviam lançado a versão 1.0, então resolví testar ele, e surgiu uma questão:
Na validação de telefone (me corrijam se estiver errado):
1- crio um novo telefone
2- seto a mascara
3- verifico se é válido
e se meu telefone puder ter várias máscaras? por exemplo: 0000-0000 e ([telefone removido] eu tenho que:
1- crio um novo telefone
2- seto a mascara
3- verifico se é válido
4- seto outra máscara
3- verifico se é válido denovo
é isso?
se for eu gosto dessa abordagem:
1- crio um novo telefone
2- seto a mascara
3- seto outra máscara
4- verifico se é válido
essa minha questão pode até parecer um pouco “idiota”, mas as vezes o que pra você pode parecer uma pergunta “besta”, para outra pessoa pode ser questão de “vida ou morte” (cara dramático não
).
Aproveitando gostaria de dar-lhes o meu parabêns pela iniciativa, BOA GALERA!!!
Basicamente é isso.Na verdade, é só seguir o curso de como vc “preenche” os dados no seu sistema.Imagine nesse caso do telefone:
Vc digitou um número, ele é formatado(ganha a máscara,por exemplo num MaskFormatter da vida, ou uma função JS para fazer isso no caso de ser na Web), é validado, e formatado de novo(se necessário) para a saída.
Eu queria saber se tem lgum lugar especifico para discutir sobre esta API ou se pode ser aqui mesmo no guj…
A idéia é discutir no GUJ justamente para o pessoal ver a “mecânica” de um projeto opensource, os problemas e tudo mais. 
Esse tópico está sendo trancado, e as discussões/dúvidas/sugestões deverão ocorrer aqui:
http://www.guj.com.br/posts/list/53808.java
Obrigado.