# dating and job search - Perl validating numbers

A variable containing only digits (with an optional decimal point) is automatically interpreted as a number when a math operation or comparison requires it. [email protected] $ ./isnumber Your string: 12.3 This is a number [email protected] $ ./isnumber Your string: 12E3 This is a number [email protected] $ ./isnumber Your string: PI Not a number [email protected] $ ./isnumber Your string: Hello Not a number REPEAT READ N$ IF FN_isanumber(N$) THEN PRINT "'" N$ "' is a number" ELSE PRINT "'" N$ "' is NOT a number" ENDIF UNTIL N$ = "end" END DATA "PI", "0123", "-0123", "12.30", "-12.30", "123! For base 10, it will treat "123." or ".123" as *numbers* but not ".".[email protected] $ bacon Converting 'isnumber.bac'... ", "0" DATA "0.0", ".123", "-.123", "12E3", "12E-3", "12 3", "end" DEF FN_isanumber(A$) ON ERROR LOCAL = FALSE IF EVAL("(" A$ ")") 'PI' is NOT a number '0123' is a number '-0123' is a number '12.30' is a number '-12.30' is a number '123! It doesn't recognize scientific notation but does recognize the integral prefixes &H, &O and &B if bases 16, 8 or 2 respectively are specified.There are also some commonly used modules for the task.

The POSIX module (part of the standard **Perl** distribution) provides the "strtod" and "strtol" for converting strings to double and longs, respectively. As part of that, numeric strings are by default stored as allomorphic types which can be used as **numbers** or strings without any conversion.

If we truly want to operate on strings, we have to explicitly coerce the allomorphs to strings.

The code writes a printable image of x whatever type it is and a statement about whether it is numeric or not. is Numeric := proc(s) try if type(parse(s), numeric) then printf("The string is numeric."): else printf("The string is not numeric."): end if: catch: printf("The string is not numeric."): end try:end proc: # $a0 char val# $a1 address pointer# $a2 PERIOD_HIT_FLAG# $a3 HAS_DIGITS_FLAG ### CHANGE THIS STRING TO TEST DIFFERENT ONES... ('abc')puts '123- is not numeric' unless is_numeric4? Very useful if you have to # scan multiple entries. ('abc')puts '123- is not numeric' unless is_numeric5?

Icon and Unicon use success and failure instead of boolean functions, numeric(x) is built-in and returns x or fails. 1234567890123456789123456789 is not a direct numeric literal. ### string: .asciiz "-.1236" s_false: .asciiz "False" s_true: .asciiz "True".textmain: set_up: #test for 0th char == 45 or 46 or 48...57 la $a1,string lb $a0,($a1) beq $a0,45,loop # == '-' beq $a0,46,loop # == '.' blt $a0,48,exit_false # isn't below the ascii range for chars '0'...'9' bgt $a0,57,exit_false # isn't above the ascii range for chars '0'...'9' loop: addi $a1,$a1,1 lb $a0,($a1) beqz $a0,exit_true # test for \0 null char beq $a0,46,period_test #test for a duplicate period blt $a0,48,exit_false #test for bgt $a0,57,exit_false la $a3,1 #set the HAS_DIGITS flag. ('abc')puts '123- is not numeric' unless is_numeric? ('abc')puts '123- is not numeric' unless is_numeric3? If, after parsing, the parse position is at # the end of the string, we can deduce that the entire string was a # valid is_numeric4? ('123.1') puts 'nil is not numeric' unless is_numeric4? ('123-')puts '1.2.3 is not numeric' unless is_numeric4? Scanner also has similar methods for longs, # shorts, bytes, doubles, floats, Big Integers, and Big Decimals as well # as methods for integral types where you may input a base/radix other than # 10 (10 is the default, which can be changed using the use Radix method)is_numeric5? ('123.1') puts 'nil is not numeric' unless is_numeric5? ('123-')puts '1.2.3 is not numeric' unless is_numeric5?

This function is not particularly useful in a statically typed language.

## Comments