Horas por extenso: convertendo as horas em um TDateTime para texto corrido.
Publicado por rafael farias novaes 27/01/2009
[ Hits: 5.423 ]
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;
Tocador de Vídeo no Lazarus(Player de Vídeo)
Script em Pascal/Kylix para controle de Locadoras sem salvar arquivos em disco
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
É cada coisa que me aparece! - não é só 3% (1)
Alguma pessoa pode me ajudar com drriver Core i3 7020u (Debian 12)? (2)
Mikrotik não mostra bytes nem packtes (1)
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código [RESOLVID... (4)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta