Horas por extenso: convertendo as horas em um TDateTime para texto corrido.
Publicado por rafael farias novaes 27/01/2009
[ Hits: 5.735 ]
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
Script em Pascal/Kylix para controle de Locadoras sem salvar arquivos em disco
Nenhum comentário foi encontrado.
Fscrypt: protegendo arquivos do seu usuário sem a lentidão padrão de criptograr o disco
Faça suas próprias atualizações de pacotes/programas no Void Linux e torne-se um Contribuidor
Como rodar o Folding@home no Linux
Criando um painel de controle (Dashboard) para seu servidor com o Homepage
O Abismo entre o Código e o Chão: Saltos Tecnológicos e a Exclusão Estrutural no Brasil
Pisando no acelerador do Linux Mint: Kernel XanMod, zRAM e Ajustes de Swap
Como compilar kernel no Linux Mint
Lançamento do Brutal DOOM test 6
Consertando o erro no Brave de webgl
Solução para ter de volta as bordas e barra de títulos das janelas em zenity no Debian 13.x
Seno, Coseno, Tangente em CLIPPER (1)
Inserir uma URL num arquvo pelo Ubuntu (CLIPPER) (0)
VMWare Player não conecta na rede nem consigo intercambiar arquivos (1)









