Horas por extenso: convertendo as horas em um TDateTime para texto corrido.

Publicado por rafael farias novaes 27/01/2009

[ Hits: 5.416 ]

Homepage: http://www.vivaolinux.com.br/perfil/verPerfil.php?login=bfmano

Download Horas Por Extenso, Convertendo as horas em um TDateTime para texto corrido..txt




1) Função auxiliar DecimalExtenso: ela está projetada para trabalhar com números entre 0 e 99, podendo ser ampliada para reaproveitamento em outras aplicações (extenso de valores).

O parâmetro Masculino foi introduzido para tratar questões de gênero (masc/fem), que ocorre quando se fala em horas (fem), mas não em minutos (masc). Com o intuito de otimizar recursos, um type cast deste parâmetro para o tipo Byte é utilizado. Com isto, se este parâmetro for True teremos como resultado  1 e se for False, teremos zero. Ao multiplicarmos este "resultado" por 2 (cnUnidadeGenero[Unidade +(Byte(Masculino)*2)]), estaremos indexando corretamente o vetor cnUnidadeGenero.


2) Função HoraPorExtenso: optou-se pelo parâmetro no formado TDateTime de modo a facilitar a processamento da função, bem como pela obrigação da validação do campo sendo passado no momento de sua chamada. Deste modo não há risco de excessões.

Como numa variável TDateTime/TTime (equivalente ao float) o valor das horas encontra-se na parte fracionária, multiplicando esta parte por 24 obtemos as horas. Com este processo, a "nova" parte fracionária corresponde aos minutos dentro daquela hora. Assim, multiplicando por 60, teremos o valor dos minutos.

  



Esconder código-fonte

const
  cnUnidadeGenero :array[1..4] of string   = ('uma', 'duas', 'um', 'dois');
  cnUnidade       :array[3..9] of string   = ('três', 'quatro', 'cinco', 'seis', 'sete', 'oito', 'nove');
  cnDezena10      :array[11..19] of string = ('onze', 'doze', 'treze', 'quatorze', 'quinze', 'dezesseis',
                                              'dezessete', 'dezoito', 'dezenove');
  cnDezena        :array[1..9] of string   = ('dez', 'vinte', 'trinta', 'quarenta', 'cinqüenta', 'sessenta',
                                              'setanta', 'oitenta', 'noventa');

// monta apenas números decimais (até 99)
function DecimalExtenso(Num :integer; Masculino :Boolean) :string;
var
  Unidade,
  Dezena :integer;
begin
  if Num > 0 then
  begin
    Unidade := Num mod 10;
    Dezena := Num div 10;
    if Dezena = 0 then
    begin
      if Unidade <= 2 then  // Os números 1 e 2 podem variar em gênero
        Result := cnUnidadeGenero[Unidade +(Byte(Masculino)*2)]
      else
        Result := cnUnidade[Unidade]
    end else
      if Unidade = 0 then
        Result := cnDezena[Dezena]
      else
        if Dezena = 1 then
          Result := cnDezena10[Num]
        else
          if Dezena <= 9 then
            if Unidade <= 2 then  // Os números 1 e 2 podem variar em gênero
              Result := cnDezena[Dezena] + ' e ' +cnUnidadeGenero[Unidade +(Byte(Masculino)*2)]
            else
              Result := cnDezena[Dezena] + ' e ' +cnUnidade[Unidade];
  end else
    Result := 'zero';
end;

// Monta a hora por extenso.
// Pode receber um campo composto por data e hora, sem problemas
function HoraPorExtenso(Horario :TTime) :string;
var
  Hora,
  Minuto :integer;
begin
  Hora := Trunc(Frac(Horario) *24);  // Obtém Horas
  Minuto := Round(Frac(Frac(Horario) *24) *60);  // Obtém Minutos
  if Minuto = 60 then
  begin
    Inc(Hora);
    Minuto := 0;
  end;
  Result := DecimalExtenso(Hora, False) + ' hora';
  if Hora > 1 then
    Result := Result +'s';
  if Minuto > 0 then
  begin
    Result := Result +' e ' +DecimalExtenso(Minuto, True) +' minuto';
    if Minuto > 1 then
      Result := Result +'s'
  end;
end;

Scripts recomendados

Árvore binária

Orientação a Objetos

Jogo da velha "inteligente"

Controle de video locadoras

Ordenando um vetor sem utilização de variáveis de contagem ou auxiliar


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts