Introdução
Expressões - Part01
Compreender algumas expressões é uma das maneiras mais assertivas para se poder interagir em qualquer contexto de comunicação, e na programação não seria diferente, afinal, é através de escrita de algumas expressões que nos comunicamos e definimos as execuções que serão realizadas pelo nosso software.
Nesta fase de seus estudos você já deve facilmente compreender expressões iguais a estas abaixo:
a = b + c representa que: a é igual a soma de b mais c
a = b > c representa que: a será verdadeiro se b for maior que c
a = b <> c representa que: a será verdadeiro se b for diferente que c (linguagem x)
a = b != c representa que: a será verdadeiro se b for diferente que c (linguagem z)
Mas e as expressões abaixo? Qual será a sua representação e finalidade na programação?
representa a geração de um texto com números com zeros à esquerda e números com 2 casas decimais
com base nos 3 argumentos recebidos respectivamente
%s%010d%,.2f
representa uma validação de e-mail
^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})$
Formatação
Imagina que recebemos a tarefa de realizar a confecção de cupom de venda não fiscal que inicialmente será exibida no console para depois salvar em arquivo.
Nem tudo o que vemos é o que realmente é
No contexto do paradigma da orientação a objetos, percebemos que o mais relevante no começo, é definir o modelo de classes para criação de nossos objetos 😲.
Definição
A classe String possui o método estático chamado format
conforme assinatura abaixo:
format(String format, Object ... args)
- O parâmetro
String format
representará o formato esperado - O parâmetro
Object ... args
representará o(s) valore(s) que será(ão) formatado(s)
Imagina como ficará a formatação do endereço no cupom em uma única linha? Esse será um de nossos desafios !!!
Tipos e especificadores
Expressões - Part02
Cada tipo de dado é representado para um caractere especificador prefixado pelo símbolo % que representa o início de cada especificador. Abaixo segue a lista com os mais utilizados
especificador | tipos de dados |
---|---|
%s | Uma string de caracteres |
%d | Dígitos inteiros |
%f | Dígitos fracionados |
%t | Representação de data e hora |
Estrutura de formatação
O parâmetro que representa a formatação possui a flexibilidade de receber em sua sintaxe os argumentos abaixo:
nome | valores | descrição |
---|---|---|
index | 1$ ,2$ e etc | representa ao índice dos argumentos que começa com 1 |
flags | 0, - | Utilizado para determinado zeros ou alinhamento à esquerda, dependente do tipo |
width | 5, 10, e etc | Comprimento do texto formatado |
.precision | 2, 3 e etc | Define a quantidade de caracteres decimais |
typechar | s, d, f e etc | tipo de dado que será formatado |
Mão na massa
Vamos realizar algumas formatações para compreendermos todos os conceitos citados acima.
Altere o código abaixo conforme os cenários apresentados:
public class StringFormat {
public static void main(String[] args) {
String formato="O nome do candidato é %s";
String argumento="Gleyson Sampaio";
System.out.println(String.format(formato, argumento));
}
}
Formatação básica
string de formatação | argumentos | resultado |
---|---|---|
"O nome do candidato é %s" | Gleyson Sampaio | O nome do candidato é Gleyson Sampaio |
"O nome do candidato é %40s" | Gleyson Sampaio | O nome do candidato é Gleyson Sampaio - comprimento de 40 caracteres justificado a direita |
"O nome do candidato é %-40s" | Gleyson Sampaio | O nome do candidato é Gleyson Sampaio - comprimento de 40 caracteres justificado a esquerda |
"O salário pretendido do candidato foi de R$ %,.2f" | 5357.45 | O salário pretendido do candidato foi de R$ 5.357,45 |
"A matrícula do candidato é %05d" | 32 | A matrícula do candidato é 00032 |
Formatação avançada
string de formatação | argumentos | resultado |
---|---|---|
"O candidato será entrevistado na data %td/%tm/%ty" | data, data, data | O candidato será entrevista da data 18/06/23 |
"O candidato será entrevistado na data %tD" | data | O candidato será entrevistado na data 06/18/23 (Locale US ou Default) |
"O candidato será entrevistado na data %1$td/%1$tm/%1$ty" | data | O candidato será entrevistado na data 18/06/23, pois informamos o mesmo índice 1$ dos argumentos |
"O candidato será entrevistado na data %td/%<tm/%<ty" | data | O candidato será entrevistado na data 18/06/23, o símbolo < representa considerar o argumento anterior |
"Os diferentes nomes %10.10s e %10.10s agora possuem o mesmo comprimento" | GLEYSON SAMPAIO, IZABELLY SAMPAIO | Os diferentes nomes GLEYSON SA e IZABELLY S agora possuem o mesmo comprimento |
"A terceira e segunda habilidades do candidato são %3$s e %2$s" | "Java", "Spring", "Postgres", "Vue" | A terceira e segunda habilidades do candidato são Postgres e Spring |
Hora da verdade
Expressões - Part03
Segue abaixo o código que nos auxiliará a compreender sobre formatação utilizando String.format
.
public class Endereco {
String cep;
String logradouro;
String numero;
String complemento;
String bairro;
//não está na UML pois o modelo pode variar
String cidade;
String uf;
}
Existem algumas divergências nas especificações para que possamos refletir sobre as respectivas soluções e omitirmos os métodos getters e setters para fins de redução de conceitos.
Chegou a hora de aplicar tudo que abordamos para implementarmos o desafio apresentado, segue abaixo o código que precisa ser complementado com o que aprendemos para conseguirmos concluir o requisito de impressão de cupom.
public class ImpressorCupom {
public void imprimir(Cupom cupom){
/**
vamos somente imprimir o resultado no console
mas este mesmo conteúdo poderá proporcionar várias saídas
logo a variável conteúdo deveria ser retornada para outros "processadores"
como gerador de arquivo txt, pdf ou até mesmo envio por e-mail
*/
/*
CONSIDERE O COMPRIMENTO MÁXIMO DE 50 CARACTERES EM CADA LINHA
E APLIQUE O RESPECTIVO ALINHAMENTO
*/
StringBuilder conteudo = new StringBuilder();
conteudo.append(tracos());
conteudo.append(cupom.nomeFantasia + "\n"); //preencher com espaços até ter 50 caracteres de comprimento
Endereco end = cupom.endereco;
conteudo.append(end.logradouro + " N. " + end.numero + " " + end.complemento + " " + end.bairro + " " + end.cidade + "-" + end.uf + "\n"); //como formatar vários campos
conteudo.append("CPF/CNPJ:" + cupom.cpf + " " + cupom.data + "\n");//calcular os respectivos comprimentos e aplicar alinhamento
conteudo.append("IE:" + cupom.ie + " " + cupom.hora + "\n");//calcular os respectivos comprimentos e aplicar alinhamento
conteudo.append("IM:" + cupom.im + " " + "CCF:" + cupom.ccf + "\n");//calcular os respectivos comprimentos e aplicar alinhamento
conteudo.append("CDD:" + cupom.cdd + "\n");//aplicar alinhamento à direita
conteudo.append(tracos());
conteudo.append("CUPOM FISCAL\n");
//modelo para ser replicado
conteudo.append(String.format("ITEM COD. %-30s%10s\n","DESCRIÇÃO","VALOR"));
for(CupomItem item:cupom.itens){
conteudo.append("DESCRICAO DE ACORDO COM CADA ITEM EXISTENTE\n");
}
conteudo.append(tracos());
System.out.println(conteudo.toString());
//em caso de resolver explorar algumas formas de apresentação
//return conteudo.toString();
}
private String tracos(){
String repeated = new String(new char[50]).replace("\0", "-");
return repeated + "\n";
}
private String cpfCnpj(String cpfCnpj){
String newCnpj = "";
if(cpfCnpj.length()==11)
newCnpj = cpfCnpj.replaceAll("(\\d{3})(\\d{3})(\\d{3})(\\d{2})", "$1.$2.$3-$4");
else
newCnpj = cpfCnpj.replaceAll("(\\d{2})(\\d{3})(\\d{3})(\\d{4})(\\d{2})", "$1.$2.$3/$4-$5");
return newCnpj;
}
}
A solução apresentada acima foi desenvolvida sem explorarmos todo o potencial do uso de formatação de caracteres, agora é com você 😉.
Nos próximos capítulos mergulharemos em um contexto que para muitos é extremamente complexo que são os conceitos de RegEx - Regular Expression ou Expressão Regular, não deixe de conferir.