Class: FocusNfe::Esquemas::Decimal

Inherits:
Object
  • Object
show all
Defined in:
lib/focus_nfe/esquemas/decimal.rb

Overview

Especificação decimal de um Campo (ex.: Decimal[13.2], Decimal[13.2-4]): até inteiros dígitos inteiros e de casas_minimas a casas_maximas casas decimais. Sabe validar um valor informado contra esses limites.

Constant Summary collapse

ESPEC =

Returns captura inteiros e a faixa de casas (ex.: Decimal[13.2-4]).

Returns:

  • (Regexp)

    captura inteiros e a faixa de casas (ex.: Decimal[13.2-4])

/\ADecimal\[(?<inteiros>\d+)(?:\.(?<casas_min>\d*)(?:-(?<casas_max>\d+))?)?\]/
VALOR =

Returns decompõe um valor em parte inteira e fracionária.

Returns:

  • (Regexp)

    decompõe um valor em parte inteira e fracionária

/\A-?(?<inteira>\d+)(?:[.,](?<fracionaria>\d+))?\z/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(match) ⇒ Decimal

Returns a new instance of Decimal.

Parameters:

  • match (MatchData)

    captura de ESPEC



32
33
34
35
36
# File 'lib/focus_nfe/esquemas/decimal.rb', line 32

def initialize(match)
  @inteiros = Integer(match[:inteiros])
  @casas_minimas = match[:casas_min].to_s.empty? ? 0 : Integer(match[:casas_min])
  @casas_maximas = match[:casas_max] ? Integer(match[:casas_max]) : @casas_minimas
end

Instance Attribute Details

#casas_maximasInteger (readonly)

Returns quantidade máxima de casas decimais.

Returns:

  • (Integer)

    quantidade máxima de casas decimais



29
30
31
# File 'lib/focus_nfe/esquemas/decimal.rb', line 29

def casas_maximas
  @casas_maximas
end

#casas_minimasInteger (readonly)

Returns quantidade mínima de casas decimais.

Returns:

  • (Integer)

    quantidade mínima de casas decimais



26
27
28
# File 'lib/focus_nfe/esquemas/decimal.rb', line 26

def casas_minimas
  @casas_minimas
end

#inteirosInteger (readonly)

Returns quantidade máxima de dígitos inteiros.

Returns:

  • (Integer)

    quantidade máxima de dígitos inteiros



23
24
25
# File 'lib/focus_nfe/esquemas/decimal.rb', line 23

def inteiros
  @inteiros
end

Class Method Details

.parsear(bruto) ⇒ Decimal?

Returns a especificação parseada, ou nil se bruto não for decimal.

Parameters:

  • bruto (String, nil)

    tipo bruto do campo

Returns:

  • (Decimal, nil)

    a especificação parseada, ou nil se bruto não for decimal



17
18
19
20
# File 'lib/focus_nfe/esquemas/decimal.rb', line 17

def self.parsear(bruto)
  match = bruto && ESPEC.match(bruto)
  match && new(match)
end

Instance Method Details

#to_hHash

Returns descrição serializável da especificação.

Returns:

  • (Hash)

    descrição serializável da especificação



51
52
53
# File 'lib/focus_nfe/esquemas/decimal.rb', line 51

def to_h
  { inteiros: inteiros, casas_minimas: casas_minimas, casas_maximas: casas_maximas }
end

#validar(valor) ⇒ String?

Valida um valor decimal. Lenient: aceita menos casas que o mínimo (zeros à direita são equivalentes) — rejeita apenas o claramente inválido.

Parameters:

  • valor (Object)

    valor informado

Returns:

  • (String, nil)

    mensagem de erro (sem o nome do campo) ou nil se válido



43
44
45
46
47
48
# File 'lib/focus_nfe/esquemas/decimal.rb', line 43

def validar(valor)
  match = VALOR.match(valor.to_s.strip)
  return "valor decimal inválido" unless match

  erro_de_tamanho(match[:inteira].to_s, match[:fracionaria])
end