Puppet Function: is_numeric

Defined in:
modules/stdlib/lib/puppet/parser/functions/is_numeric.rb
Function type:
Ruby 3.x API

Overview

is_numeric()Boolean

Returns true if the given argument is a Numeric (Integer or Float), or a String containing either a valid integer in decimal base 10 form, or a valid floating point string representation.

The function recognizes only decimal (base 10) integers and float but not integers in hex (base 16) or octal (base 8) form.

The string representation may start with a '-' (minus). If a decimal '.' is used, it must be followed by at least one digit.

> *Note: *Deprecated* Will be removed in a future version of stdlib. See [`validate_legacy`](#validate_legacy).

Returns:

  • (Boolean)

    Returns `true` or `false`



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'modules/stdlib/lib/puppet/parser/functions/is_numeric.rb', line 5

newfunction(:is_numeric, :type => :rvalue, :doc => <<-DOC
  @summary
    **Deprecated:** Returns true if the given value is numeric.

  Returns true if the given argument is a Numeric (Integer or Float),
  or a String containing either a valid integer in decimal base 10 form, or
  a valid floating point string representation.

  The function recognizes only decimal (base 10) integers and float but not
  integers in hex (base 16) or octal (base 8) form.

  The string representation may start with a '-' (minus). If a decimal '.' is used,
  it must be followed by at least one digit.

  @return [Boolean]
    Returns `true` or `false`

  > **Note:* **Deprecated** Will be removed in a future version of stdlib. See
  [`validate_legacy`](#validate_legacy).
  DOC
           ) do |arguments|

  function_deprecation([:is_numeric, 'This method is deprecated, please use the stdlib validate_legacy function,
                        with Stdlib::Compat::Numeric. There is further documentation for validate_legacy function in the README.'])

  if arguments.size != 1
    raise(Puppet::ParseError, "is_numeric(): Wrong number of arguments given #{arguments.size} for 1")
  end

  value = arguments[0]

  # Regex is taken from the lexer of puppet
  # puppet/pops/parser/lexer.rb but modified to match also
  # negative values and disallow invalid octal numbers or
  # numbers prefixed with multiple 0's (except in hex numbers)
  #
  # TODO these parameters should be constants but I'm not sure
  # if there is no risk to declare them inside of the module
  # Puppet::Parser::Functions

  # TODO: decide if this should be used
  # HEX numbers like
  # 0xaa230F
  # 0X1234009C
  # 0x0012
  # -12FcD
  # numeric_hex = %r{^-?0[xX][0-9A-Fa-f]+$}

  # TODO: decide if this should be used
  # OCTAL numbers like
  # 01234567
  # -045372
  # numeric_oct = %r{^-?0[1-7][0-7]*$}

  # Integer/Float numbers like
  # -0.1234568981273
  # 47291
  # 42.12345e-12
  numeric = %r{^-?(?:(?:[1-9]\d*)|0)(?:\.\d+)?(?:[eE]-?\d+)?$}

  if value.is_a?(Numeric) || (value.is_a?(String) &&
    value.match(numeric) # or
                               #  value.match(numeric_hex) or
                               #  value.match(numeric_oct)
                             )
    return true
  else
    return false
  end
end