Caros Amigos,
Pretendo demonstrar neste artigo uma aplicação Java para definir a hora por extenso. Obtendo para a hora 20:43:14, por exemplo, o seguinte resultado: vinte horas, quarenta e três minutos e quatorze segundos.
No método main() da classe Exemplo, apresentada na Listagem 1, foi declarado o objeto agora a partir da classe Calendar (pacote java.util). A classe Calendar fornece um método de classe chamado getInstance() que retorna um objeto Calendar com os campos de calendário inicializados com a data e hora atual. As variáveis h (horas), m (minutos) e s (segundos) recebem em suas respectivas declarações os valores retornados pelas chamadas do método get() utilizando como argumentos os valores dos campos de calendário para: hora- Calenda.HOUR, minutos- Calendar.MINUTE e segundos- Calendar.SECOND. Se o valor das horas se encontra após ao meio dia (Calendar.PM==1) a este valor será somado 12 horas (trabalhando com o relógio no sistema de 24 horas). Por último, na variável result será concatenado o resultado da hora por extenso através das chamadas ao método tempoPorExtenso(). Obs. os tempos de minutos e segundos iguais a zero são ignorados no resultado.
O método tempoPorExtenso(), ainda na Listagem 1, foi implementado com dois parâmetros: n- valor do tempo (horas, minutos ou segundos); e, tipo- utilizado para indicar que o tempo recebido corresponde, 1- horas, 2- minutos e 3- segundos. No corpo do método foram declaradas três variáveis: parte- vetor de strings que indexa o extenso dos valores de 0 até 19; dezena- vetor de strings que indexa o extenso das dezenas 20, 30, 40 e 50; e, s- string que concatena o resultado do extenso do valor (valor de retorno). A lógica implementada para definir o valor: horas, minutos ou segundos por extenso, está baseada na verificação do valor do parâmetro n. Se o valor de n for menor que 19 o extenso será definido através da variável parte (parte[n]), caso contrário, o valor é definido pela combinação do extenso da dezena (dezena[dez]) com o extenso da unidade (parte[unid]), quando houver. É importante destacar que os valores: uma hora, duas horas, vinte e uma horas e vinte e duas horas, são tratados diferentemente no código do que, por exemplo: um minuto, dois minutos, vinte e um minutos e vinte e dois minutos. Finalizando o trecho de código do método será concatenado a variável s o tipo do valor tratado: 1- hora, 2- minuto e 3- segundo, verificando por último se o valor está no plural (n > 1), neste caso, será acrescentado o caractere 's' ao resultado final.
Listagem 1. Aplicação Java para definir a hora por extenso.
import java.util.Calendar;
public class Exemplo {
public static void main(String[] args) {
Calendar agora = Calendar.getInstance();
// horas, minutos e segundos
int h = agora.get(Calendar.HOUR) + ((Calendar.PM==1)?12:0);
int m = agora.get(Calendar.MINUTE);
int s = agora.get(Calendar.SECOND);
String result = tempoPorExtenso(h, 1);
if ((m != 0) && (s != 0)) // tem minutos e segundos
result = result + ", " + tempoPorExtenso(m, 2) + " e " +
tempoPorExtenso(s, 3);
else if (m != 0) // so tem minutos (segundos = zero)
result = result + " e " + tempoPorExtenso(m, 2);
else if (s != 0) // so tem segundos (minutos = zero)
result = result + " e " + tempoPorExtenso(s, 3);
System.out.printf("Resultado:\n%s\n", result);
}
// o parâmetro "tipo" foi utilizado para indicar que o tempo recebido
// (parâmetro "n") corresponde: 1- horas, 2- minutos e 3- segundos.
public static String tempoPorExtenso(int n, int tipo) {
String parte[] = {"zero", "um", "dois", "três",
"quatro", "cinco", "seis", "sete", "oito", "nove",
"dez", "onze", "doze", "treze", "quatorze", "quinze",
"dezesseis", "dezessete", "dezoito", "dezenove"};
String dezena[] = {"", "", "vinte", "trinta", "quarenta", "cinquenta"};
String s;
if (n <= 19) {
if ((tipo == 1) && (n == 1)) // uma hora da madrugada
s = "uma";
else if ((tipo == 1) && (n == 2)) // duas horas da madrugada
s = "duas";
else s = parte[n];
}
else {
int dez = n / 10;
int unid = n % 10;
s = dezena[dez];
if (unid != 0) {
if ((tipo == 1) && (unid == 1)) // vinte e uma horas
s = s + " e uma";
else if ((tipo == 1) && (unid == 2)) // vinte e duas horas
s = s + " e duas";
else s = s + " e " + parte[unid];
}
}
if (tipo == 1)
s = s + " hora";
else if (tipo == 2)
s = s + " minuto";
else s = s + " segundo";
if (n > 1) // plural
s = s + "s";
return(s); // respondendo a chamada com o extenso do valor
}
}
Ao executar a aplicação o resultado apresentado na Figura 1 poderá ser exibido.
Figura 1. Executando a aplicação.
Veja também:
1) Data por Extenso em uma Aplicação Java
2) Valor por Extenso em uma Aplicação Java
3) Hora por Extenso em uma Aplicação Delphi
Obrigado e um abraço.
Prof. Omero Francisco Bertol (http://www.pb.utfpr.edu.br/omero/)
Aplicações Java (http://www.pb.utfpr.edu.br/omero/Java/Fontes.HTM)