Horas por extenso: convertendo as horas em um TDateTime para texto corrido.
Publicado por rafael farias novaes 27/01/2009
[ Hits: 5.608 ]
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 extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Linux é a solução para o fim do Windows10? (3)
Assinador JNLP do Site Portal da Nota Fiscal Eletrônica (0)
Programa fora de escala na tela do pc (29)









