Horas por extenso: convertendo as horas em um TDateTime para texto corrido.
Publicado por rafael farias novaes 27/01/2009
[ Hits: 5.455 ]
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;
Script em Pascal/Kylix para controle de Locadoras sem salvar arquivos em disco
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI