Horas por extenso: convertendo as horas em um TDateTime para texto corrido.
Publicado por rafael farias novaes 27/01/2009
[ Hits: 5.652 ]
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.
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;
Ordenando um vetor sem utilização de variáveis de contagem ou auxiliar
Nenhum comentário foi encontrado.
Como atualizar sua versão estável do Debian
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Script de montagem de chroot automatica
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Conky, alerta de temperatura alta (12)
De volta para o futuro - ou melhor, para o presente (parte 2) (2)
Por que passar nas disciplinas da faculdade é ruim e ser reprovado é b... (7)









