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.

Executando a aplicação

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)