Determine if a string is numeric: Difference between revisions

added C translation to C++
(added C translation to C++)
 
(23 intermediate revisions by 17 users not shown)
Line 32:
</pre>
The code:
<langsyntaxhighlight lang="6502asm">*=$0801
db $0E,$08,$0A,$00,$9E,$20,$28,$32,$30,$36,$34,$29,$00,$00,$00 ;required init code on commodore 64 floppy disks
*=$0810
Line 158:
db "1.000.000",0
TestString8:
db ".23456",0</langsyntaxhighlight>
 
{{out}}
Line 200:
 
=={{header|8th}}==
<langsyntaxhighlight Forthlang="forth">: number? >n >kind ns:n n:= ;</langsyntaxhighlight>
 
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
<lang AArch64 Assembly>
/* ARM assembly Raspberry PI */
/* program strNumber.s */
Line 409:
.include "../includeARM64.inc"
 
</syntaxhighlight>
</lang>
 
=={{header|Action!}}==
Line 416:
The solution below uses conversion string to number and number to string to determine if the string is numeric.
{{libheader|Action! Tool Kit}}
<langsyntaxhighlight Actionlang="action!">INCLUDE "D2:REAL.ACT" ;from the Action! Tool Kit
 
BYTE FUNC AreEqual(CHAR ARRAY a,b)
Line 478:
Test("1.23BC")
Test("5.6.3")
RETURN</langsyntaxhighlight>
 
=== Using a finite-state machine ===
The solution below uses a finite-state machine to determine if a string is numeric.
<langsyntaxhighlight Actionlang="action!">BYTE FUNC IsSign(CHAR c)
IF c='- OR c='+ THEN
RETURN (1)
Line 621:
Test("1.23BC")
Test("5.6.3")
RETURN</langsyntaxhighlight>
 
{{out}}
Line 636:
 
=={{header|ActionScript}}==
<langsyntaxhighlight lang="actionscript">public function isNumeric(num:String):Boolean
{
return !isNaN(parseInt(num));
}</langsyntaxhighlight>
 
=={{header|Ada}}==
The first file is the package interface containing the declaration of the Is_Numeric function.
<langsyntaxhighlight lang="ada">package Numeric_Tests is
function Is_Numeric (Item : in String) return Boolean;
end Numeric_Tests;</langsyntaxhighlight>
The second file is the package body containing the implementation of the Is_Numeric function.
<langsyntaxhighlight lang="ada">package body Numeric_Tests is
function Is_Numeric (Item : in String) return Boolean is
Dummy : Float;
Line 657:
return False;
end Is_Numeric;
end Numeric_Tests;</langsyntaxhighlight>
The last file shows how the Is_Numeric function can be called.
<langsyntaxhighlight lang="ada">with Ada.Text_Io; use Ada.Text_Io;
with Numeric_Tests; use Numeric_Tests;
 
Line 670:
Put_Line(S2 & " results in " & Boolean'Image(Is_Numeric(S2)));
Put_Line(S3 & " results in " & Boolean'Image(Is_Numeric(S3)));
end Is_Numeric_Test;</langsyntaxhighlight>
{{out}}
<pre>
Line 679:
 
=={{header|Aime}}==
<langsyntaxhighlight lang="aime">integer
is_numeric(text s)
{
Line 696:
 
return 0;
}</langsyntaxhighlight>
 
=={{header|ALGOL 68}}==
Line 705:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of FORMATted transput}}
<langsyntaxhighlight lang="algol68">PROC is numeric = (REF STRING string) BOOL: (
BOOL out := TRUE;
PROC call back false = (REF FILE f)BOOL: (out:= FALSE; TRUE);
Line 731:
))
)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 740:
 
=={{header|ALGOL W}}==
<langsyntaxhighlight lang="algolw">begin
 
% determnines whether the string contains an integer, real or imaginary %
Line 874:
testIsNumeric( " -.345LI", true );
 
end.</langsyntaxhighlight>
{{out}}
<pre>
Line 896:
=={{header|Apex}}==
The isNumeric() method is part of the Apex String Class. Note that it will return false if applied to a decimal, because the '.' character is not a Unicode digit.
<syntaxhighlight lang="apex">
<lang Apex>
String numericString = '123456';
String partlyNumericString = '123DMS';
Line 905:
System.debug(decimalString.isNumeric()); // this will be false
System.debug(decimalString.remove('.').isNumeric()); // this will be true
</syntaxhighlight>
</lang>
 
=={{header|APL}}==
{{works with|Dyalog APL}}
<langsyntaxhighlight lang="apl"> ⊃⎕VFI{w←⍵⋄((w='-')/w)←'¯'⋄w}'152 -3.1415926 Foo123'
 
1 1 0</langsyntaxhighlight>
Works with more recent versions of <B>Dyalog APL</B><langsyntaxhighlight lang="apl"> ⊃⎕VFI '¯' @ ('-'∘=) '152 -3.1415926 Foo123' ⍝ Fast: replacement of - with APL high-minus required for ⎕VFI
1 1 0
⊃⎕VFI '-' ⎕R '¯' ⊣ '152 -3.1415926 Foo123' ⍝ Simple: (ditto)
1 1 0</langsyntaxhighlight>
 
{{works with|GNU APL}}
<langsyntaxhighlight lang="apl">
{∧/⍵∊(⊃,¨'0123456789¯.+')}¨'152' '¯3.1415926' 'Foo123'
1 1 0
</syntaxhighlight>
</lang>
 
=={{header|AppleScript}}==
<syntaxhighlight lang="applescript">
<lang AppleScript>
-- isNumString :: String -> Bool
on isNumString(s)
Line 986:
end script
end if
end mReturn</langsyntaxhighlight>
 
{{Out}}
<langsyntaxhighlight AppleScriptlang="applescript">{false, false, false, true, true, true, true, false, false, false}</langsyntaxhighlight>
 
The classic way's slightly simpler, since the coercion result ''must'' be a real or an integer if the coercion itself didn't error.
 
<langsyntaxhighlight lang="applescript">on isNumString(s)
if (s's class is not text) then return false
try
Line 1,001:
return false
end try
end isNumString</langsyntaxhighlight>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
<lang ARM Assembly>
 
/* ARM assembly Raspberry PI */
Line 1,208:
 
 
</syntaxhighlight>
</lang>
 
=={{header|Arturo}}==
<langsyntaxhighlight lang="rebol">print numeric? "hello world"
print numeric? "1234"
print numeric? "1234 hello world"
print numeric? "12.34"
print numeric? "!#@$"
print numeric? "-1.23"</langsyntaxhighlight>
{{out}}
Line 1,229:
=={{header|AutoHotkey}}==
AutoHotkey has no explicitly defined variable types. A variable containing only digits (with an optional decimal point) is automatically interpreted as a number when a math operation or comparison requires it.
<langsyntaxhighlight lang="autohotkey">list = 0 .14 -5.2 ten 0xf
Loop, Parse, list, %A_Space%
MsgBox,% IsNumeric(A_LoopField)
Line 1,240:
}
 
;Output: 1 1 1 0 1</langsyntaxhighlight>
 
=={{header|AWK}}==
The following function uses the fact that non-numeric strings in AWK are treated as having the value 0 when used in arithmetics, but not in comparison:
<syntaxhighlight lang="awk">
<lang AWK>
$ awk 'function isnum(x){return(x==x+0)} BEGIN{print isnum("hello"),isnum("-42")}'
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,253:
 
=={{header|BaCon}}==
<langsyntaxhighlight lang="bacon">INPUT "Your string: ", s$
 
IF REGEX(s$, "^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$") THEN
Line 1,259:
ELSE
PRINT "Not a number"
ENDIF</langsyntaxhighlight>
{{out}}
<pre>
Line 1,277:
 
=={{header|BASIC}}==
<langsyntaxhighlight lang="qbasic">10 INPUT "Enter a string";S$:GOSUB 1000
20 IF R THEN PRINT "Is num" ELSE PRINT"Not num"
99 END
1000 T1=VAL(S$):T1$=STR$(T1)
1010 R=T1$=S$ OR T1$=" "+S$
1099 RETURN</langsyntaxhighlight>
 
 
==={{header|BASIC256}}===
<syntaxhighlight lang="basic256">
<lang BASIC256>
#La función isNumeric() es nativa de BASIC256.
#Devuelve 1 (verdadero) si la expresión es un entero,
Line 1,313:
print s, " => "; isNumeric(s)
end
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,328:
 
==={{header|Commodore BASIC}}===
<langsyntaxhighlight lang="commodorebasic">5 print chr$(147);chr$(14)
10 input "Enter a string";s$:gosub 1000:print
20 if r then print "You entered a number.":goto 99
Line 1,335:
1000 t1=val(s$):t1$=str$(t1)
1010 r=t1$=s$ or t1$=" "+s$
1099 return</langsyntaxhighlight>
 
{{out}}
Line 1,352:
&#9608;</pre>
==={{header|QB64}}===
<syntaxhighlight lang="qb64">
<lang QB64>
Input "Enter a text or a number: ", v$ 'The "$" establishes that this is a string variable. So whatever entered will be stored as
'a string.
Line 1,368:
Sleep
System
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,385:
 
=={{header|Batch File}}==
<langsyntaxhighlight lang="dos">set /a a=%arg%+0 >nul
if %a% == 0 (
if not "%arg%"=="0" (
Line 1,394:
) else (
echo Numeric.
)</langsyntaxhighlight>
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> REPEAT
READ N$
IF FN_isanumber(N$) THEN
Line 1,417:
IF LEFT$(A$,1) = "0" THEN = TRUE
= FALSE
</syntaxhighlight>
</lang>
{{out}}
<pre>'PI' is NOT a number
Line 1,435:
 
=={{header|Befunge}}==
<langsyntaxhighlight lang="befunge"> ~:0\`#v_:"+"-!#v_:"-"-!#v_::"E"-\"e"-*#v_ v
v _v# < < 0<
>~:0\`#v_>::"0"-0\`\"9"-0`+!#v_:"."-!#v_::"E"-\"e"-*!#v_ v
Line 1,444:
>~:0\`#v_>::"0"-0\`\"9"-0`+!#v_:"."-!#v_::"E"-\"e"-*!v 0 > v
^ $< v < << ^_^#-"-"<
> "ciremuN">:#,_@ >>#$_"ciremun toN">:#,_@^ <</langsyntaxhighlight>
 
 
Line 1,469:
'192.168.0.1' Not numeric
</pre>
 
=={{header|BQN}}==
<syntaxhighlight lang="bqn">IsNumeric ← 1∘•ParseFloat⎊0</syntaxhighlight>
 
=={{header|Bracmat}}==
To check whether a string is a number, a fraction or an integer, use the patterns <code>#</code>, <code>/</code> and <code>~/#</code> ("not a fraction and yet a number"). In the pattern matching examples below (which can be typed in at the Bracmat prompt) <code>F</code> denotes 'failure' and <code>S</code> denotes 'success'.
 
<langsyntaxhighlight lang="bracmat">43257349578692:/
F
 
Line 1,483 ⟶ 1,486:
 
80000000000:~/#
S</langsyntaxhighlight>
Bracmat doesn't do floating point computations (historical reason: the Acorn Risc Machine a.k.a. ARM processor in the Archimedes computer did not have an FPU), but theThe pattern <code>~/# (|"." (|? 0|`) (|~/#:>0)) (|(E|e) ~/#)</code> recognises string representations of floating point numbers.
<langsyntaxhighlight lang="bracmat">@("1.000-4E-10":~/# (|"." (|? 0|`) (|~/#:>0)) (|(E|e) ~/#))
F
 
Line 1,513 ⟶ 1,516:
 
@("0.0000":~/# (|"." (|? 0|`) (|~/#:>0)) (|(E|e) ~/#))
S</langsyntaxhighlight>
 
Calculations with floating point numbers are delegated to UFP (Un-I-fancy-fied Floating Point, because it took me 30 years to dream up a viable way to do FP in Bracmat without breaking existing code) objects. An UFP object compiles and executes code that only handles C "doubles" and (multidimensional) arrays of such values.
To do computations with such "floating point strings" you would have to convert such strings to fractional representations first.
<lang bracmat>(float2fraction=
integerPart decimalPart d1 dn exp sign
. @( !arg
: ~/#?integerPart
( &0:?decimalPart:?d1:?dn
| "."
[?d1
(|? 0|`)
( &0:?decimalPart
| ~/#?decimalPart:>0
)
[?dn
)
( &0:?exp
| (E|e) ~/#?exp
)
)
& ( !integerPart*(-1:?sign):>0:?integerPart
| 1:?sign
)
& !sign*(!integerPart+!decimalPart*10^(!d1+-1*!dn))*10^!exp
);
 
( out$float2fraction$"1.2"
& out$float2fraction$"1.02"
& out$float2fraction$"1.01"
& out$float2fraction$"10.01"
& out$float2fraction$"10.01e10"
& out$float2fraction$"10.01e1"
& out$float2fraction$"10.01e2"
& out$float2fraction$"10.01e-2"
& out$float2fraction$"-10.01e-2"
& out$float2fraction$"-10e-2"
& out$float2fraction$"0.000"
);
</lang>
{{out}}
<pre>6/5
51/50
101/100
1001/100
100100000000
1001/10
1001
1001/10000
-1001/10000
-1/10
0</pre>
 
=={{header|Burlesque}}==
<langsyntaxhighlight lang="burlesque">
ps^^-]to{"Int""Double"}\/~[\/L[1==?*
</syntaxhighlight>
</lang>
 
Assumes string is not empty.
Line 1,575 ⟶ 1,530:
Returns true (non-zero) if character-string parameter represents a signed or unsigned floating-point number. Otherwise returns false (zero).
 
<langsyntaxhighlight lang="c">#include <ctype.h>
#include <stdbool.h>
#include <stdlib.h>
 
int isNumeric (const char * s)
bool isNumeric(const char *s) {
{
if (s == NULL || *s == '\0' || isspace(*s)) {
return 0false;
char * p;}
strtodchar (s, &*p);
strtod(s, &p);
return *p == '\0';
}</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
'''Framework:''' [[.NET]] 2.0+
 
<langsyntaxhighlight lang="csharp">public static bool IsNumeric(string s)
{
double Result;
Line 1,599 ⟶ 1,556:
{
// do something
}</langsyntaxhighlight>
 
'''Framework:''' [[.NET]] 1.0+
 
<langsyntaxhighlight lang="csharp">public static bool IsNumeric(string s)
{
try
Line 1,614 ⟶ 1,571:
return false;
}
}</langsyntaxhighlight>
 
=={{header|C++}}==
{{trans|C}}<syntaxhighlight lang="cpp">#include <cctype>
#include <cstdlib>
 
bool isNumeric(const char *s) {
if (s == nullptr || *s == '\0' || std::isspace(*s)) {
return false;
}
char *p;
std::strtod(s, &p);
return *p == '\0';
}</syntaxhighlight>
 
Using stringstream:
<langsyntaxhighlight lang="cpp">#include <sstream> // for istringstream
 
using namespace std;
Line 1,646 ⟶ 1,615:
return ( iss.rdbuf()->in_avail() == 0 );
}
</syntaxhighlight>
</lang>
 
Using find:
<langsyntaxhighlight lang="cpp">
bool isNumeric( const char* pszInput, int nNumberBase )
{
Line 1,657 ⟶ 1,626:
return (input.find_first_not_of(base.substr(0, nNumberBase)) == string::npos);
}
</syntaxhighlight>
</lang>
 
Using all_of (requires C++11)
<langsyntaxhighlight lang="cpp">
bool isNumeric(const std::string& input) {
return std::all_of(input.begin(), input.end(), ::isdigit);
}
</syntaxhighlight>
</lang>
 
=={{header|CFScript}}==
ColdFusion Script (CfScript)
<syntaxhighlight lang ="cfm">isNumeric(42)</langsyntaxhighlight>
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">(defn numeric? [s]
(if-let [s (seq s)]
(let [s (if (= (first s) \-) (next s) s)
Line 1,677 ⟶ 1,646:
s (if (= (first s) \.) (next s) s)
s (drop-while #(Character/isDigit %) s)]
(empty? s))))</langsyntaxhighlight>
This works with any sequence of characters, not just Strings, e.g.:
<langsyntaxhighlight lang="clojure">(numeric? [\1 \2 \3]) ;; yields logical true</langsyntaxhighlight>
 
Clojure has a fairly rich set of numeric literals, including Ratios, BigInts and BigDecimals. The Clojure reader will attempt to read any form starting with a digit (optionally preceded by a '+' or '-') as a number. So the following checks to see if such a read is successful:
<langsyntaxhighlight lang="clojure">
(require '[clojure.edn :as edn])
(import [java.io PushbackReader StringReader])
Line 1,694 ⟶ 1,663:
; Check that the string has nothing after the number
(= -1 (.read reader)))))))
</syntaxhighlight>
</lang>
<langsyntaxhighlight lang="clojure">
user=> (number-string? "2r101010")
true
user=> (number-string? "22/7")
true
</syntaxhighlight>
</lang>
 
=={{header|COBOL}}==
Line 1,706 ⟶ 1,675:
COBOL has the intrinsic functions <code>TEST-NUMVAL</code> and <code>TEST-NUMVAL-C</code> to check if a string is numeric (<code>TEST-NUMVAL-C</code> is used to check if it is also a monetary string). Implementations supporting the 20XX draft standard can also use <code>TEST-NUMVAL-F</code> for floating-point numbers. They return 0 if the string is valid, or the position of the first incorrect character.
 
<langsyntaxhighlight lang="cobol"> program-id. is-numeric.
procedure division.
display function test-numval-f("abc") end-display
Line 1,715 ⟶ 1,684:
display "failed numval-f test" end-display
end-if
goback.</langsyntaxhighlight>
 
===Implementation===
{{works with|OpenCOBOL}}
<langsyntaxhighlight lang="cobol"> IDENTIFICATION DIVISION.
PROGRAM-ID. Is-Numeric.
 
Line 1,772 ⟶ 1,741:
 
GOBACK
.</langsyntaxhighlight>
 
=={{header|CoffeeScript}}==
The isFinite function is built into JavaScript, so we don't need to create our own function in CoffeeScript.
<langsyntaxhighlight lang="coffeescript">
console.log (isFinite(s) for s in [5, "5", "-5", "5", "5e5", 0]) # all true
console.log (isFinite(s) for s in [NaN, "fred", "###"]) # all false
</syntaxhighlight>
</lang>
 
=={{header|ColdFusion}}==
Adobe's ColdFusion
 
<langsyntaxhighlight lang="cfm"><cfset TestValue=34>
TestValue: <cfoutput>#TestValue#</cfoutput><br>
<cfif isNumeric(TestValue)>
Line 1,798 ⟶ 1,767:
<cfelse>
is NOT Numeric.
</cfif></langsyntaxhighlight>
===Alternative solution===
<syntaxhighlight lang="text"><cfoutput>#isNumeric(42)#</cfoutput></langsyntaxhighlight>
 
=={{header|Common Lisp}}==
If the input may be relied upon to not be especially malicious, then it may be ''read'' and the result checked for being a number.
<langsyntaxhighlight lang="lisp">(defun numeric-string-p (string)
(let ((*read-eval* nil))
(ignore-errors (numberp (read-from-string string)))))</langsyntaxhighlight>
<code>ignore-errors</code> here handles returning nil in case the input is invalid rather than simply non-numeric.
 
However, <code>read</code>[<code>-from-string</code>] has the side effect of interning any symbols encountered, and can have memory allocation larger than the input size (due to read syntax such as <code>#*</code>, which takes a length). The [http://www.cliki.net/PARSE-NUMBER <code>parse-number</code>] library provides a numbers-only equivalent of <code>read</code>.
<langsyntaxhighlight lang="lisp">(defun numeric-string-p (string)
(ignore-errors (parse-number:parse-number string))) ; parse failed, return false (nil)</langsyntaxhighlight>
 
=={{header|D}}==
Line 1,817 ⟶ 1,786:
Using the standard Phobos function (currently binary and hex literals are not recognized):
 
<langsyntaxhighlight lang="d">import std.stdio, std.string, std.array;
 
void main() {
Line 1,825 ⟶ 1,794:
"-0b10101", "0x10.5"])
writefln(`isNumeric("%s"): %s`, s, s.strip().isNumeric(true));
}</langsyntaxhighlight>
{{out}}
<pre>isNumeric("12"): true
Line 1,843 ⟶ 1,812:
 
===An Implementation===
<langsyntaxhighlight lang="d">import std.stdio, std.string, std.conv, std.array, std.exception;
 
bool isNumeric(in string s) pure {
Line 1,869 ⟶ 1,838:
"-0b10101", "0x10.5"])
writefln(`isNumeric("%s"): %s`, s, s.isNumeric);
}</langsyntaxhighlight>
{{out}}
<pre>isNumeric("12"): true
Line 1,889 ⟶ 1,858:
This simple function is a wrapper around a built-in Delphi function
 
<syntaxhighlight lang="delphi">
<lang Delphi>
function IsNumericString(const inStr: string): Boolean;
var
Line 1,896 ⟶ 1,865:
Result := TryStrToFloat(inStr,i);
end;
</syntaxhighlight>
</lang>
 
This console application tests the function:
 
<syntaxhighlight lang="delphi">
<lang Delphi>
program isNumeric;
 
Line 1,953 ⟶ 1,922:
end.
 
</syntaxhighlight>
</lang>
 
{{out}} Example summarised:
Line 1,965 ⟶ 1,934:
 
=={{header|Dyalect}}==
<langsyntaxhighlight lang="dyalect">func String.IsNumeric() {
try {
parse(this) is Integer or Float
Line 1,974 ⟶ 1,943:
var str = "1234567"
print(str.IsNumeric())</langsyntaxhighlight>
 
=={{header|Déjà Vu}}==
<langsyntaxhighlight lang="dejavu">is-numeric s:
true
try:
Line 1,985 ⟶ 1,954:
 
for v in [ "1" "0" "3.14" "hello" "12e3" "12ef" "-3" ]:
!.( v is-numeric v )</langsyntaxhighlight>
{{out}}
<pre>"-3" true
Line 1,996 ⟶ 1,965:
 
=={{header|E}}==
<langsyntaxhighlight lang="e">def isNumeric(specimen :String) {
try {
<import:java.lang.makeDouble>.valueOf(specimen)
Line 2,003 ⟶ 1,972:
return false
}
}</langsyntaxhighlight>
 
=={{header|EasyLang}}==
<syntaxhighlight lang="text">
<lang>func is_numeric a$ . r .
func is_numeric a$ .
h = number a$
r =h 1= -number errora$
# because every variable must be used
h = h
return 1 - error
.
for s$ in [ "abc" "21a" "1234" "-13" "7.65" ]
call if is_numeric s$ r= 1
print s$ & " is numeric"
if r = 1
else
print s$ & " is numeric"
print s$ & " is not numeric"
else
.
print s$ & " is not numeric"
.
</syntaxhighlight>
.</lang>
 
=={{header|EchoLisp}}==
The conversion function '''string->number''' returns #f - false - in the string is not a number, else returns a number, which is #t - true - as far as logical operations are concerned
<langsyntaxhighlight lang="scheme">
(string->number "albert")
→ #f
Line 2,030 ⟶ 2,000:
(if (string->number 666) 'YES 'NO)
→ YES
</syntaxhighlight>
</lang>
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">defmodule RC do
def is_numeric(str) do
case Float.parse(str) do
Line 2,042 ⟶ 2,012:
end
 
["123", "-12.3", "123.", ".05", "-12e5", "+123", " 123", "abc", "123a", "12.3e", "1 2"] |> Enum.filter(&RC.is_numeric/1)</langsyntaxhighlight>
 
{{out}}
<pre>
["123", "-12.3", "-12e5", "+123"]
</pre>
 
=={{header|EMal}}==
<syntaxhighlight lang="emal">
fun isNumeric = logic by text value
try
^|So funny:
|a) we check if it's castable to a real
|b) we obtain the real 0.0
|c) conversion from real to int to get 0
|d) int can be converted to logical to get ⊥
|e) we can negate the result
|^
return not when(value.contains("."), logic!int!(real!value * 0), logic!(int!value * 0))
remedy
return false
end
end
fun main = int by List args
if args.length == 1
writeLine(isNumeric(args[0]))
else
writeLine("value".padEnd(8, " ") + " " + "numeric")
for each text value in text["0o755", "thursday", "3.14", "0b1010", "-100", "0xff"]
writeLine(value.padEnd(8, " ") + " " + isNumeric(value))
end
end
return 0
end
exit main(Runtime.args)
</syntaxhighlight>
{{out}}
<pre>
value numeric
0o755 ⊤
thursday ⊥
3.14 ⊤
0b1010 ⊤
-100 ⊤
0xff ⊤
</pre>
 
Line 2,052 ⟶ 2,062:
Erlang doesn't come with a way to say if a string represents a numeric value or not, but does come with the built-in function <tt>is_number/1</tt>, which will return true if the argument passed is either an integer or a float. Erlang also has two functions to transform a string to either a floating number or an integer, which will be used in conjunction with <tt>is_number/1</tt>.
 
<langsyntaxhighlight lang="erlang">is_numeric(L) ->
Float = (catch erlang:list_to_float(L)),
Int = (catch erlang:list_to_integer(L)),
is_number(Float) orelse is_number(Int).</langsyntaxhighlight>
 
=={{header|ERRE}}==
Short form using predeclared ERRE functions VAL and STR$.
<langsyntaxhighlight lang="erre">
PROGRAM NUMERIC
 
Line 2,075 ⟶ 2,085:
IF ANS% THEN PRINT("is num") ELSE PRINT("not num")
END PROGRAM
</syntaxhighlight>
</lang>
{{out}}
<pre>Enter a string? 12.30
Line 2,082 ⟶ 2,092:
 
=={{header|Euphoria}}==
<langsyntaxhighlight Euphorialang="euphoria">include get.e
 
function is_numeric(sequence s)
Line 2,088 ⟶ 2,098:
val = value(s)
return val[1]=GET_SUCCESS and atom(val[2])
end function</langsyntaxhighlight>
 
=={{header|F_Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">let is_numeric a = fst (System.Double.TryParse a)</langsyntaxhighlight>
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">: numeric? ( string -- ? ) string>number >boolean ;</langsyntaxhighlight>
 
=={{header|Fantom}}==
The 'fromStr' methods return a parsed number or given an error. The 'false' tells each method to return null if the string does not parse as a number of given type, otherwise, the 'fromStr' method throws an exception.
 
<syntaxhighlight lang="java">
<lang fantom>
 
class Main
{
Line 2,124 ⟶ 2,135:
}
}
</syntaxhighlight>
</lang>
 
{{out}}
Line 2,133 ⟶ 2,144:
For '2a5': false
For '-2.1e5': true
</pre>
 
Another example inspired by the Kotlin example. Fantom does not have an enhanced for-loop (foreach) loop, but instead uses Closures as the primary mechanism of iteration.
 
<syntaxhighlight lang="java">
/* gary chike 08/27/2023 */
 
class Main {
static Void main() {
inputs := ["152\n", "-3.141", "Foo123", "-0", "456bar", "1.0E10"]
 
inputs.each |Str input| { echo("$input.trim \tis " + (isNumeric(input) ? "numeric" : "not numeric"))}
 
static Bool isNumeric(Str input) {
try {
input.toFloat
return true
}
catch(Err e) {
return false
}
}
}
</syntaxhighlight>
{{out}}
<pre>
152 is numeric
-3.141 is numeric
Foo123 is not numeric
-0 is numeric
456bar is not numeric
1.0E10 is numeric
</pre>
 
=={{header|Forth}}==
{{works with|gforth|0.6.2}}
<langsyntaxhighlight lang="forth">: is-numeric ( addr len -- )
2dup snumber? ?dup if \ not standard, but >number is more cumbersome to use
0< if
Line 2,158 ⟶ 2,201:
hex
s" beef" is-numeric \ beef as integer = BEEF
s" &1234" is-numeric \ &1234 as integer = 4D2 ( decimal literal )</langsyntaxhighlight>
 
=={{header|Fortran}}==
<langsyntaxhighlight lang="fortran">FUNCTION is_numeric(string)
IMPLICIT NONE
CHARACTER(len=*), INTENT(IN) :: string
Line 2,169 ⟶ 2,212:
READ(string,*,IOSTAT=e) x
is_numeric = e == 0
END FUNCTION is_numeric</langsyntaxhighlight>
 
=={{header|Free Pascal}}==
<langsyntaxhighlight lang="pascal">function isNumeric(const potentialNumeric: string): boolean;
var
potentialInteger: integer;
Line 2,189 ⟶ 2,232:
isNumeric := (integerError = 0) or (realError = 0);
end;</lang>
</syntaxhighlight>
 
The following is a more complete and compilable example.
 
<syntaxhighlight lang="pascal">
program IsNumeric;
 
type
TDynamicArrayItem = record
StrValue: string;
end;
 
var
myDynamicArray: array of TDynamicArrayItem;
i: Integer;
Value: Extended;
Code: Integer;
 
begin
// Initialize the dynamic array with different data types
SetLength(myDynamicArray, 7);
myDynamicArray[0].StrValue := 'Hello';
myDynamicArray[1].StrValue := '42';
myDynamicArray[2].StrValue := '3.14159';
myDynamicArray[3].StrValue := 'World';
myDynamicArray[4].StrValue := '99';
myDynamicArray[5].StrValue := '0777'; // Octal representation for 511
myDynamicArray[6].StrValue := '$A1'; // Hexadecimal representation for 161
 
// Iterate through the dynamic array and determine data type
for i := Low(myDynamicArray) to High(myDynamicArray) do
begin
Val(myDynamicArray[i].StrValue, Value, Code);
if Code = 0 then // The value 0 for Code indicates that the conversion was successful.
Writeln('Element ', i, ': Numeric Value ', Chr(9),' - ', Value) // Chr(9) = tab
else
Writeln('Element ', i, ': Non-Numeric Value ', Chr(9), ' - ', myDynamicArray[i].StrValue);
end;
end.
{ Val converts the value represented in the string 'StrValue' to a numerical value or an enumerated value, and stores this value in the variable 'Value', which can be of type Longint, Real and Byte or any enumerated type. If the conversion isn't successful, then the parameter 'Code' contains the index of the character in 'StrValue' which prevented the conversion. }
 
</syntaxhighlight>
 
{{out}}:
<pre>
Free Pascal Compiler version 3.2.2 [2021/10/28] for x86_64
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Darwin for x86_64
Compiling arrVariantIsNumeric.pas
Assembling arrvariantisnumeric
Linking arrVariantIsNumeric
37 lines compiled, 0.3 sec
 
Element 0: Non-Numeric Value - Hello
Element 1: Numeric Value - 4.20000000000000000000E+0001
Element 2: Numeric Value - 3.14158999999999999993E+0000
Element 3: Non-Numeric Value - World
Element 4: Numeric Value - 9.90000000000000000000E+0001
Element 5: Numeric Value - 7.77000000000000000000E+0002
Element 6: Non-Numeric Value - $A1
</pre>
 
=={{header|FreeBASIC}}==
Line 2,198 ⟶ 2,302:
I've therefore written a custom function which recognizes signed numbers in bases from 2 to 16 (but only integral numbers for bases other than 10). For base 10, it will treat "123." or ".123" as numbers but not ".". 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.
 
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Dim Shared symbols(0 To 15) As UByte
Line 2,292 ⟶ 2,396:
Print
Print "Press any key to quit"
Sleep</langsyntaxhighlight>
 
{{out}}
Line 2,306 ⟶ 2,410:
123xyz (base 10) => false
xyz (base 10) => false
</pre>
 
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">include "NSLog.incl"
 
local fn StringIsNumeric( string as CFStringRef ) as BOOL
BOOL flag = NO
ScannerRef scanner = fn ScannerWithString( string )
if ( fn ScannerScanFloat( scanner, NULL ) )
flag = fn ScannerIsAtEnd( scanner )
end if
end fn = flag
 
NSLog(@"%d",fn StringIsNumeric( @"1.23" ))
NSLog(@"%d",fn StringIsNumeric( @"-123.4e5" ))
NSLog(@"%d",fn StringIsNumeric( @"alpha" ))
 
HandleEvents</syntaxhighlight>
 
{{out}}
<pre>
1
1
0
</pre>
 
=={{header|Gambas}}==
<langsyntaxhighlight lang="gambas">Public Sub Form_Open()
Dim sAnswer, sString As String
 
Line 2,317 ⟶ 2,445:
Print sAnswer
 
End</langsyntaxhighlight>
Output:
<pre>
Line 2,326 ⟶ 2,454:
=={{header|Go}}==
This uses a library function to meet the task's requirements:
<langsyntaxhighlight lang="go">package main
 
import (
Line 2,344 ⟶ 2,472:
fmt.Printf(" %4s -> %t\n", s, isNumeric(s))
}
}</langsyntaxhighlight>
 
{{out}}
Line 2,358 ⟶ 2,486:
 
This uses both a library function and a custom one but only checks for integerness:
<langsyntaxhighlight lang="go">package main
 
import (
Line 2,385 ⟶ 2,513:
i := "one"
fmt.Printf(" %3s -> %t\n", i, isInt(i))
}</langsyntaxhighlight>
 
{{out}}
Line 2,396 ⟶ 2,524:
=={{header|Groovy}}==
Use the positional parser in java.text.NumberFormat. If, after parsing, the parse position is at the end of the string, we can deduce that the entire string was a valid number.
<langsyntaxhighlight lang="groovy">def isNumeric = {
def formatter = java.text.NumberFormat.instance
def pos = [0] as java.text.ParsePosition
Line 2,404 ⟶ 2,532:
// them the whole string was numeric
pos.index == it.size()
}</langsyntaxhighlight>
 
Test Program:
<langsyntaxhighlight lang="groovy">println isNumeric('1')
println isNumeric('-.555')
println isNumeric('1,000,000')
println isNumeric(' 1 1 1 1 ')
println isNumeric('abcdef')</langsyntaxhighlight>
 
{{out}}
Line 2,426 ⟶ 2,554:
The task doesn't define which strings are considered "numeric", so we do Integers and Doubles, which should catch the most common cases (including hexadecimal 0x notation):
 
<langsyntaxhighlight lang="haskell">isInteger s = case reads s :: [(Integer, String)] of
[(_, "")] -> True
_ -> False
Line 2,435 ⟶ 2,563:
 
isNumeric :: String -> Bool
isNumeric s = isInteger s || isDouble s</langsyntaxhighlight>
 
One can easily add ''isRational'', ''isComplex'' etc. following the same pattern.
Line 2,441 ⟶ 2,569:
Another way would be to use the Data.Char module, allowing code such as:
 
<langsyntaxhighlight lang="haskell">areDigits = all isDigit
isDigit selects ASCII digits i.e. '0'..'9'
isOctDigit selects '0'..'7'
isHexDigit selects '0'..'9','A'..'F','a'..'f'</langsyntaxhighlight>
 
so read s::Int (for instance) could be reliably used if string s passed these tests.
 
=={{header|Haxe}}==
Haxe has a built-in function that will convert a string to an integer, so we can use that to determine if the string is numeric or not. <langsyntaxhighlight ActionScriptlang="actionscript">
static function isNumeric(n:String):Bool
{
Line 2,461 ⟶ 2,589:
}
}
</syntaxhighlight>
</lang>
 
=={{header|HicEst}}==
<langsyntaxhighlight lang="hicest"> ! = bin + 2*int + 4*flt + 8*oct +16*hex + 32*sci
isNumeric("1001") ! 27 = 1 1 0 1 1 0
isNumeric("123") ! 26 = 0 1 0 1 1 0
Line 2,490 ⟶ 2,618:
isNumeric = (Lbin==L) + 2*(Lint==L) + 4*(Lflt==L) + 8*(Loct==L) + 16*(Lhex==L) + 32*(Lsci==L)
ENDIF
END</langsyntaxhighlight>
 
=={{header|i}}==
<langsyntaxhighlight lang="i">concept numeric(n) {
number(n)
errors {
Line 2,508 ⟶ 2,636:
numeric("abcdefg")
numeric("1234test")
}</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
The code writes a printable image of x whatever type it is and a statement about whether it is numeric or not. Icon and Unicon use success and failure instead of boolean functions, numeric(x) is built-in and returns x or fails.
<syntaxhighlight lang="icon">
<lang Icon>
write(image(x), if numeric(x) then " is numeric." else " is not numeric")
</syntaxhighlight>
</lang>
 
=={{header|IDL}}==
<langsyntaxhighlight lang="idl">function isnumeric,input
on_ioerror, false
test = double(input)
return, 1
false: return, 0
end</langsyntaxhighlight>
 
Could be called like this:
 
<langsyntaxhighlight lang="idl">if isnumeric('-123.45e-2') then print, 'yes' else print, 'no'
; ==> yes
if isnumeric('picklejuice') then print, 'yes' else print, 'no'
; ==> no</langsyntaxhighlight>
 
=={{header|Insitux}}==
 
Non-null and non-false values are truthy in Insitux. The operation <b>to-num</b> returns null if it is unable to parse its string parameter, else the parsed number. The operation <b>bool</b> is unnecessary in most situations, but is composed with <b>to-num</b> here to satisfy the task specification.
 
<syntaxhighlight lang="insitux">> (var numeric? (comp to-num bool))
(comp to-num bool)
 
> (numeric? "123")
true
 
> (numeric? "0x25")
true
 
> (numeric? "0b0101")
true
 
> (numeric? "hello")
false
 
> (numeric? "123x456")
false</syntaxhighlight>
 
=={{header|J}}==
<langsyntaxhighlight lang="j">isNumeric=: _ ~: _ ". ]
isNumericScalar=: 1 -: isNumeric
TXT=: ,&' a scalar numeric value.' &.> ' is not';' represents'
sayIsNumericScalar=: , TXT {::~ isNumericScalar</langsyntaxhighlight>
Examples of use:
<langsyntaxhighlight lang="j"> isNumeric '152'
1
isNumeric '152 -3.1415926 Foo123'
Line 2,546 ⟶ 2,696:
0
sayIsNumericScalar '-3.1415926'
-3.1415926 represents a scalar numeric value.</langsyntaxhighlight>
 
=={{header|Java}}==
Typically, you would use the 'parse' methods from either the ''Integer'', ''Long'', ''Float'', or ''Double'' class, <br />which will throw a ''NumberFormatException'' for ill-formed values.<br />
For example
<syntaxhighlight lang="java">
Integer.parseInt("12345")
</syntaxhighlight>
<syntaxhighlight lang="java">
Float.parseFloat("123.456")
</syntaxhighlight>
The performance mark is somewhat negligible between a try-block and custom methods.
<syntaxhighlight lang="java">
public static void main(String[] args) {
String value;
value = "1234567";
System.out.printf("%-10s %b%n", value, isInteger(value));
value = "12345abc";
System.out.printf("%-10s %b%n", value, isInteger(value));
value = "-123.456";
System.out.printf("%-10s %b%n", value, isFloatingPoint(value));
value = "-.456";
System.out.printf("%-10s %b%n", value, isFloatingPoint(value));
value = "123.";
System.out.printf("%-10s %b%n", value, isFloatingPoint(value));
value = "123.abc";
System.out.printf("%-10s %b%n", value, isFloatingPoint(value));
}
 
static boolean isInteger(String string) {
String digits = "0123456789";
for (char character : string.toCharArray()) {
if (!digits.contains(String.valueOf(character)))
return false;
}
return true;
}
 
static boolean isFloatingPoint(String string) {
/* at least one decimal-point */
int indexOf = string.indexOf('.');
if (indexOf == -1)
return false;
/* assure only 1 decimal-point */
if (indexOf != string.lastIndexOf('.'))
return false;
if (string.charAt(0) == '-' || string.charAt(0) == '+') {
string = string.substring(1);
indexOf--;
}
String integer = string.substring(0, indexOf);
if (!integer.isEmpty()) {
if (!isInteger(integer))
return false;
}
String decimal = string.substring(indexOf + 1);
if (!decimal.isEmpty())
return isInteger(decimal);
return true;
}
</syntaxhighlight>
<pre>
1234567 true
12345abc false
-123.456 true
-.456 true
123. true
123.abc false
</pre>
<br />
It's generally bad practice in Java to rely on an exception being thrown since exception handling is relatively expensive. If non-numeric strings are common, you're going to see a huge performance hit.
<langsyntaxhighlight lang="java">public boolean isNumeric(String input) {
try {
Integer.parseInt(input);
Line 2,559 ⟶ 2,776:
return false;
}
}</langsyntaxhighlight>
 
Alternative 1 : Check that each character in the string is number. Note that this will only works for integers.
 
<langsyntaxhighlight lang="java">private static final boolean isNumeric(final String s) {
if (s == null || s.isEmpty()) return false;
for (int x = 0; x < s.length(); x++) {
Line 2,572 ⟶ 2,789:
}
return true; // valid
}</langsyntaxhighlight>
 
Alternative 2 : use a regular expression (a more elegant solution).
 
<langsyntaxhighlight lang="java">public static boolean isNumeric(String inputData) {
return inputData.matches("[-+]?\\d+(\\.\\d+)?");
}</langsyntaxhighlight>
 
Alternative 3 : use the positional parser in the java.text.NumberFormat object (a more robust solution). If, after parsing, the parse position is at the end of the string, we can deduce that the entire string was a valid number.
 
<langsyntaxhighlight lang="java">public static boolean isNumeric(String inputData) {
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition pos = new ParsePosition(0);
formatter.parse(inputData, pos);
return inputData.length() == pos.getIndex();
}</langsyntaxhighlight>
 
Alternative 4 : use the java.util.Scanner object. Very useful if you have to scan multiple entries.
 
<langsyntaxhighlight lang="java">public static boolean isNumeric(String inputData) {
Scanner sc = new Scanner(inputData);
return sc.hasNextInt();
}</langsyntaxhighlight>
Scanner also has similar methods for longs, shorts, bytes, doubles, floats, BigIntegers, and BigDecimals 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 useRadix method).
 
=={{header|JavaScript}}==
A far better validator can be found on StackOverflow[http://stackoverflow.com/questions/18082/validate-numbers-in-javascript-isnumeric]
<langsyntaxhighlight lang="javascript">function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
Line 2,608 ⟶ 2,825:
//Or, in web browser in address field:
// javascript:function isNumeric(n) {return !isNaN(parseFloat(n)) && isFinite(n);}; value="123.45e4"; if(isNumeric(value)) {alert('numeric')} else {alert('non-numeric')}
</syntaxhighlight>
</lang>
 
=={{header|jq}}==
In versions of jq that support try/catch, the simplest way to test if a string can be parsed as a number is:<syntaxhighlight lang ="jq">try tonumber catch false</langsyntaxhighlight>
The above expression will emit the corresponding number, or false if there is none. Here then is a boolean filter which will also emit true for each input that is a number:
<langsyntaxhighlight lang="jq">def is_numeric: true and try tonumber catch false;</langsyntaxhighlight>
 
=={{header|Julia}}==
The function <tt>isnumber</tt> tests for strings that parse directly to numbers. This test excludes symbols, such as &pi; and <tt>1 + 1</tt>, that evaluate to numbers as well as certain elaborate numbers (large integers, rationals and complex numbers) whose literals parse to expressions that must be evaluated to yield numbers.
 
<langsyntaxhighlight lang="julia">using Printf
 
isnumber(s::AbstractString) = tryparse(Float64, s) isa Number
Line 2,628 ⟶ 2,845:
fl = isnumber(t) ? "is" : "is not"
@printf("%35s %s a direct numeric literal.\n", t, fl)
end</langsyntaxhighlight>
 
{{out}}
Line 2,650 ⟶ 2,867:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1
 
fun isNumeric(input: String): Boolean =
Line 2,663 ⟶ 2,880:
val inputs = arrayOf("152", "-3.1415926", "Foo123", "-0", "456bar", "1.0E10")
for (input in inputs) println("$input is ${if (isNumeric(input)) "numeric" else "not numeric"}")
}</langsyntaxhighlight>
 
{{out}}
Line 2,682 ⟶ 2,899:
{{works with|Lasso|8 & 9 }}
 
<langsyntaxhighlight Lassolang="lasso">local(str='12345')
string_isNumeric(#str) // true</langsyntaxhighlight>
 
{{works with|Lasso|9}}
 
<langsyntaxhighlight Lassolang="lasso">'12345'->isdigit // true
'1X34Q'->isdigit // false</langsyntaxhighlight>
 
=={{header|Liberty BASIC}}==
<syntaxhighlight lang="lb">
<lang lb>
DATA "PI", "0123", "-0123", "12.30", "-12.30", "123!", "0"
DATA "0.0", ".123", "-.123", "12E3", "12E-3", "12+3", "end"
Line 2,748 ⟶ 2,965:
[NotNumber]
end function
</langsyntaxhighlight>
 
=={{header|Lisaac}}==
<syntaxhighlight lang="lisaac">
<lang Lisaac>
"123457".is_integer.println;
// write TRUE on stdin
</syntaxhighlight>
</lang>
 
=={{header|Logo}}==
<langsyntaxhighlight lang="logo">show number? "-1.23 ; true</langsyntaxhighlight>
 
=={{header|Lua}}==
This will also accept strings like "0xFF" or "314.16e-2" as numbers.
<langsyntaxhighlight lang="lua">if tonumber(a) ~= nil then
--it's a number
end;
</syntaxhighlight>
</lang>
 
=={{header|M2000 Interpreter}}==
We have to define our IsNumber()
Version 2 handle decimal point character. For code M2000 use dot, but for input and output use the user specified decimal point, from OS. Function Str$(1.2) return a string with a dot always, but if we place a second parameter this change. Print str$(1.2, "") maybe return 1,2 and nor 1.2. Print str$(1.2, "#.00") maybe return 1.20 or 1,20. The reverse function is Val() which can take more characters so A Val("121mm") is 121, and with a second parameter we can interpret properly the decimal dot: Print Val("1.2", ".") always return 1.2 double. Print Val("1,2", ",")=1.2 return true, 1.2 is a m2000 number literal and always has a dot.
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
\\ version 2
Module Checkit {
Line 2,804 ⟶ 3,021:
Checkit
 
</syntaxhighlight>
</lang>
 
From rev.31 Version 9.3 Val function update, to include a more quick version of above. We have to specify the dot char or write any two or more chars for dot to get integer part. Val function return number and in third argument (passing by reference by default) return first position in string after number. If string is empty or have no number then position is -1. If a number found position is >1. Leading spaces trimmed.
 
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Function IsNumeric(a$) {
def m
Line 2,839 ⟶ 3,056:
Print isNumeric("1221.211.1221")=false, isNumeric("1221e1212")=false, isNumeric("1.2e4323")=false, isNumeric("-.122e-10")
 
</syntaxhighlight>
</lang>
 
=={{header|Maple}}==
<langsyntaxhighlight lang="maple">isNumeric := proc(s)
try
if type(parse(s), numeric) then
Line 2,852 ⟶ 3,069:
printf("The string is not numeric."):
end try:
end proc:</langsyntaxhighlight>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">NumberQ[ToExpression["02553352000242"]]</langsyntaxhighlight>
 
=={{header|MATLAB}}==
<syntaxhighlight lang="matlab">
<lang MATLAB>
function r = isnum(a)
r = ~isnan(str2double(a))
Line 2,870 ⟶ 3,087:
disp(isnum("3.1415")) % 1
 
</syntaxhighlight>
</lang>
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">numberp(parse_string("170141183460469231731687303715884105727"));</langsyntaxhighlight>
 
=={{header|MAXScript}}==
<langsyntaxhighlight lang="maxscript">fn isNumeric str =
(
try
Line 2,885 ⟶ 3,102:
)
 
isNumeric "123"</langsyntaxhighlight>
 
=={{header|min}}==
{{works with|min|0.19.3}}
<langsyntaxhighlight lang="min">(
dup (((int integer?) (pop false)) try) dip
((float float?) (pop false)) try or
) :numeric?</langsyntaxhighlight>
 
=={{header|MiniScript}}==
We rely on conversion to number returning a nonzero number, plus special checks for zero strings. Note that the <code>val</code> function is forgiving about additional characters ''after'' the number, so our function is too.
<langsyntaxhighlight MiniScriptlang="miniscript">isNumeric = function(s)
return s == "0" or s == "-0" or val(s) != 0
end function
Line 2,904 ⟶ 3,121:
print isNumeric("-3.14157")
print isNumeric("5@*#!")
print isNumeric("spam")</langsyntaxhighlight>
 
{{out}}
Line 2,914 ⟶ 3,131:
 
=={{header|MIPS Assembly}}==
<langsyntaxhighlight lang="mips">
# $a0 char val
# $a1 address pointer
Line 2,966 ⟶ 3,183:
li $a2,1
j loop
</syntaxhighlight>
</lang>
 
=={{header|Mirah}}==
<langsyntaxhighlight lang="mirah">import java.text.NumberFormat
import java.text.ParsePosition
import java.util.Scanner
Line 3,093 ⟶ 3,310:
puts 'abc is not numeric' unless is_numeric5?('abc')
puts '123- is not numeric' unless is_numeric5?('123-')
puts '1.2.3 is not numeric' unless is_numeric5?('1.2.3')</langsyntaxhighlight>
 
=={{header|mIRC Scripting Language}}==
{{works with|mIRC}}
<langsyntaxhighlight lang="mirc">var %value = 3
if (%value isnum) {
echo -s %value is numeric.
}</langsyntaxhighlight>
 
=={{header|Modula-3}}==
<langsyntaxhighlight lang="modula3">MODULE Numeric EXPORTS Main;
 
IMPORT IO, Fmt, Text;
Line 3,127 ⟶ 3,344:
IO.Put("isNumeric(-3.1415926) = " & Fmt.Bool(isNumeric("-3.1415926")) & "\n");
IO.Put("isNumeric(Foo123) = " & Fmt.Bool(isNumeric("Foo123")) & "\n");
END Numeric.</langsyntaxhighlight>
 
{{out}}
Line 3,170 ⟶ 3,387:
 
=={{header|Nanoquery}}==
<langsyntaxhighlight Nanoquerylang="nanoquery">def isNum(str)
try
double(str)
Line 3,177 ⟶ 3,394:
return false
end
end</langsyntaxhighlight>
 
=={{header|Nemerle}}==
<langsyntaxhighlight Nemerlelang="nemerle">using System;
using System.Console;
 
Line 3,198 ⟶ 3,415:
WriteLine($"$not is numeric: $(IsNumeric(not))");
}
}</langsyntaxhighlight>
 
=={{header|NetRexx}}==
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref symbols nobinary
 
Line 3,238 ⟶ 3,455:
]
return testData
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,276 ⟶ 3,493:
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">import strutils
 
proc isNumeric(s: string): bool =
Line 3,288 ⟶ 3,505:
 
for s in Strings:
echo s, " is ", if s.isNumeric(): "" else: "not ", "numeric"</langsyntaxhighlight>
 
We could prefer to use the “parsutils” module which avoids the exception:
 
<langsyntaxhighlight Nimlang="nim">import parseutils
 
proc isNumeric(s: string): bool =
Line 3,301 ⟶ 3,518:
 
for s in Strings:
echo s, " is ", if s.isNumeric(): "" else: "not ", "numeric"</langsyntaxhighlight>
 
{{out}}
Line 3,310 ⟶ 3,527:
Inf is numeric
rose is not numeric</pre>
 
=={{header|Nu}}==
<syntaxhighlight lang="nu">
def is-numeric [] {try {into float | true} catch {false}}
 
["1" "12" "-3" "5.6" "-3.14" "one" "cheese"] | each {{k: $in, v: ($in | is-numeric)}}
</syntaxhighlight>
{{out}}
<pre>
╭───┬────────┬───────╮
│ # │ k │ v │
├───┼────────┼───────┤
│ 0 │ 1 │ true │
│ 1 │ 12 │ true │
│ 2 │ -3 │ true │
│ 3 │ 5.6 │ true │
│ 4 │ -3.14 │ true │
│ 5 │ one │ false │
│ 6 │ cheese │ false │
╰───┴────────┴───────╯
</pre>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">
class Numeric {
function : Main(args : String[]) ~ Nil {
Line 3,323 ⟶ 3,561:
return str->IsFloat();
}
}</langsyntaxhighlight>
 
=={{header|Objective-C}}==
Line 3,332 ⟶ 3,570:
The ''NSScanner'' class supports scanning of strings for various types. The ''scanFloat'' method will return YES if the string is numeric, even if the number is actually too long to be contained by the precision of a ''float''.
 
<langsyntaxhighlight lang="objc">if( [[NSScanner scannerWithString:@"-123.4e5"] scanFloat:NULL] )
NSLog( @"\"-123.4e5\" is numeric" );
else
Line 3,341 ⟶ 3,579:
NSLog( @"\"Not a number\" is not numeric" );
// prints: "-123.4e5" is numeric
// prints: "Not a number" is not numeric</langsyntaxhighlight>
 
The following function can be used to check if a string is numeric "totally"; this is achieved by checking if the scanner reached the end of the string after the float is parsed.
 
<langsyntaxhighlight lang="objc">BOOL isNumeric(NSString *s)
{
NSScanner *sc = [NSScanner scannerWithString: s];
Line 3,353 ⟶ 3,591:
}
return NO;
}</langsyntaxhighlight>
 
If we want to scan ''by hand'', we could use a function like the following, that checks if a number is an integer positive or negative number; spaces can appear at the beginning, but not after the number, and
the '+' or '-' can appear only ''attached'' to the number ("+123" returns YES, but "+ 123" returns NO).
 
<langsyntaxhighlight lang="objc">BOOL isNumericI(NSString *s)
{
NSUInteger len = [s length];
Line 3,382 ⟶ 3,620:
}
return (i == len) && status;
}</langsyntaxhighlight>
 
Here we assumed that in the internal encoding of a string (that should be Unicode), 1 comes after 0, 2 after 1 and so on until 9. Another way could be to get the C String from the NSString object, and then the parsing would be the same of the one we could do in standard C, so this path is not given.
Line 3,392 ⟶ 3,630:
The task doesn't define which strings are considered "numeric", so we do ints and floats, which should catch the most common cases:
 
<langsyntaxhighlight lang="ocaml">let is_int s =
try ignore (int_of_string s); true
with _ -> false
Line 3,400 ⟶ 3,638:
with _ -> false
 
let is_numeric s = is_int s || is_float s</langsyntaxhighlight>
 
=={{header|Octave}}==
The builtin function <tt>isnumeric</tt> return true (1) if the argument is a data of type ''number''; the provided function <tt>isnum</tt> works the same for numeric datatype, while if another type is passed as argument, it tries to convert it to a number; if the conversion fails, it means it is not a string representing a number.
 
<langsyntaxhighlight lang="octave">function r = isnum(a)
if ( isnumeric(a) )
r = 1;
Line 3,418 ⟶ 3,656:
disp(isnum("foo123")) % 0
disp(isnum("123bar")) % 0
disp(isnum("3.1415")) % 1</langsyntaxhighlight>
 
=={{header|Odin}}==
 
<syntaxhighlight lang="odin">package main
 
import "core:strconv"
import "core:fmt"
 
is_numeric :: proc(s: string) -> bool {
_, ok := strconv.parse_f32(s)
return ok
}
 
main :: proc() {
strings := []string{"1", "3.14", "-100", "1e2", "Inf", "rose"}
for s in strings {
fmt.println(s, "is", is_numeric(s) ? "numeric" : "not numeric")
}
}
 
/* Output:
1 is numeric
3.14 is numeric
-100 is numeric
1e2 is numeric
Inf is not numeric
rose is not numeric
*/</syntaxhighlight>
 
=={{header|Oz}}==
<langsyntaxhighlight lang="oz">fun {IsNumeric S}
{String.isInt S} orelse {String.isFloat S}
end</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">isNumeric(s)={
my(t=type(eval(s)));
t == "t_INT" || t == "T_REAL"
};</langsyntaxhighlight>
 
=={{header|Pascal}}==
Line 3,435 ⟶ 3,701:
 
=={{header|PeopleCode}}==
<syntaxhighlight lang="peoplecode">
<lang PeopleCode>
Built-In Function
Syntax
Line 3,461 ⟶ 3,727:
/* do non-numeric processing */
End-if;
</syntaxhighlight>
</lang>
 
=={{header|Perl}}==
{{works with|Perl|5.8}}
<langsyntaxhighlight lang="perl">use Scalar::Util qw(looks_like_number);
print looks_like_number($str) ? "numeric" : "not numeric\n";</langsyntaxhighlight>
 
{{works with|Perl|5.8}}
Line 3,475 ⟶ 3,741:
Assuming that you don't care about [[IEEE]] notations like "NaN" or "Infinity", you probably just want to use a [[Regular expression matching|regular expression]].
 
<langsyntaxhighlight lang="perl">if (/\D/) { print "has nondigits\n" }
if (/^\d+\z/) { print "is a whole number\n" }
if (/^-?\d+\z/) { print "is an integer\n" }
Line 3,482 ⟶ 3,748:
if (/^-?(?:\d+(?:\.\d*)?&\.\d+)\z/) { print "is a decimal number\n" }
if (/^([+-]?)(?=\d&\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?\z/)
{ print "a C float\n" }</langsyntaxhighlight>
 
There are also some commonly used modules for the task. Scalar::Util (distributed with 5.8) provides access to Perl's internal function "looks_like_number" for determining whether a variable looks like a number. Data::Types exports functions that validate data types using both the above and other regular expressions. Thirdly, there is "Regexp::Common" which has regular expressions to match various types of numbers. Those three modules are available from the CPAN.
Line 3,488 ⟶ 3,754:
If you're on a [[POSIX]] system, Perl supports the "POSIX::strtod" function. Its semantics are somewhat cumbersome, so here's a "getnum" wrapper function for more convenient access. This function takes a string and returns the number it found, or "undef" for input that isn't a C float. The "is_numeric" function is a front end to "getnum" if you just want to say, ''Is this a float?''
 
<langsyntaxhighlight lang="perl">sub getnum {
use POSIX;
my $str = shift;
Line 3,502 ⟶ 3,768:
}
 
sub is_numeric { defined getnum($_[0]) }</langsyntaxhighlight>
 
Or you could check out the String::Scanf module on the CPAN instead. The POSIX module (part of the standard Perl distribution) provides the "strtod" and "strtol" for converting strings to double and longs, respectively.
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">function</span> <span style="color: #000000;">isNumber</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">return</span> <span style="color: #7060A8;">scanf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%f"</span><span style="color: #0000FF;">)!={}</span>
Line 3,540 ⟶ 3,806:
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\nnot numeric: "</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">pp</span><span style="color: #0000FF;">(</span><span style="color: #000000;">notnumb</span><span style="color: #0000FF;">,{</span><span style="color: #004600;">pp_Indent</span><span style="color: #0000FF;">,</span><span style="color: #000000;">13</span><span style="color: #0000FF;">})</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 3,555 ⟶ 3,821:
 
=={{header|PHP}}==
<langsyntaxhighlight lang="php"><?php
$string = '123';
if(is_numeric(trim($string))) {
}
?></langsyntaxhighlight>
 
=={{header|PicoLisp}}==
The '[http://software-lab.de/doc/refF.html#format format]' function can
be used for that. It returns NIL if the given string is not a legal number
<langsyntaxhighlight PicoLisplang="picolisp">: (format "123")
-> 123
 
Line 3,571 ⟶ 3,837:
 
: (format "-123.45" 4)
-> 1234500</langsyntaxhighlight>
 
=={{header|Pike}}==
Line 3,577 ⟶ 3,843:
the %s before and after make sure the number is not surrounded by other text.
 
<syntaxhighlight lang="pike">
<lang Pike>
int(0..1) is_number(string s)
{
Line 3,590 ⟶ 3,856:
is_number(num);
-> true
</syntaxhighlight>
</lang>
 
=={{header|PL/I}}==
<syntaxhighlight lang="pl/i">
<lang PL/I>
is_numeric: procedure (text) returns (bit (1));
declare text character (*);
Line 3,605 ⟶ 3,871:
done:
return ('0'b);
end is_numeric;</langsyntaxhighlight>
<pre>
5 '1'B
Line 3,615 ⟶ 3,881:
 
=={{header|PL/SQL}}==
<langsyntaxhighlight lang="plsql">FUNCTION IsNumeric( value IN VARCHAR2 )
RETURN BOOLEAN
IS
Line 3,625 ⟶ 3,891:
WHEN others THEN
return( FALSE );
END;</langsyntaxhighlight>
 
<langsyntaxhighlight lang="plsql">Value VARCHAR2( 10 ) := '123';
IF( IsNumeric( Value ) )
THEN
NULL;
END IF;</langsyntaxhighlight>
 
=={{header|Plain English}}==
Line 3,640 ⟶ 3,906:
<code>If the string is any numeric literal,</code>
in this solution.
<langsyntaxhighlight lang="plainenglish">To run:
Start up.
Show whether "cat" is numeric.
Line 3,658 ⟶ 3,924:
Write the string then " -> " on the console without advancing.
If the string is any numeric literal, write "yes" on the console; exit.
Write "no" on the console.</langsyntaxhighlight>
{{out}}
<pre>
Line 3,676 ⟶ 3,942:
Note: PowerShell 1.0 does not support 'try'
THis simply tries arithmetic with the argument and if that fails, ''false'' is returned.
<langsyntaxhighlight lang="powershell">function isNumeric ($x) {
try {
0 + $x | Out-Null
Line 3,683 ⟶ 3,949:
return $false
}
}</langsyntaxhighlight>
 
But this one doesn't work for strings like "8." though a . is appended it returns true!
Line 3,689 ⟶ 3,955:
Alternatively, you can use the static System.Int32.TryParse() method in the .NET framework.
 
<langsyntaxhighlight lang="powershell">function isNumeric ($x) {
$x2 = 0
$isNum = [System.Int32]::TryParse($x, [ref]$x2)
return $isNum
}</langsyntaxhighlight>
 
=={{header|Prolog}}==
Line 3,700 ⟶ 3,966:
The code:
 
<langsyntaxhighlight lang="prolog">numeric_string(String) :-
atom_string(Atom, String),
atom_number(Atom, _).</langsyntaxhighlight>
 
A predicate to test the code:
 
<langsyntaxhighlight lang="prolog">test_strings(Strings) :-
forall( member(String, Strings),
( ( numeric_string(String)
Line 3,713 ⟶ 3,979:
format('~w is ~w number.~n', [String, Result])
)
).</langsyntaxhighlight>
 
Example of using the test predicate:
 
<langsyntaxhighlight lang="prolog">?- test_strings(["123", "0.123", "-123.1", "NotNum", "1."]).
123 is a number.
0.123 is a number.
Line 3,723 ⟶ 3,989:
NotNum is not a number.
1. is not a number.
true.</langsyntaxhighlight>
 
=={{header|PureBasic}}==
This routine parses the string to verify it's a number. It returns 1 if string is numeric, 0 if it is not. The character used as the decimal separator may be specified if desired.
<langsyntaxhighlight PureBasiclang="purebasic">Procedure IsNumeric(InString.s, DecimalCharacter.c = '.')
#NotNumeric = #False
#IsNumeric = #True
Line 3,780 ⟶ 4,046:
Input()
CloseConsole()
EndIf</langsyntaxhighlight>
{{out}}
<pre>'+3183.31151E+321' = 1
Line 3,789 ⟶ 4,055:
=={{header|Python}}==
===Python: Simple int/float===
<langsyntaxhighlight lang="python">def is_numeric(s):
try:
float(s)
Line 3,796 ⟶ 4,062:
return False
 
is_numeric('123.0')</langsyntaxhighlight>
 
Or for positive integers only:
 
<syntaxhighlight lang ="python">'123'.isdigit()</langsyntaxhighlight>
 
===Python: Most numeric literals===
Including complex, hex, binary, and octal numeric literals we get:
<langsyntaxhighlight lang="python">def is_numeric(literal):
"""Return whether a literal can be parsed as a numeric value"""
castings = [int, float, complex,
Line 3,816 ⟶ 4,082:
except ValueError:
pass
return False</langsyntaxhighlight>
 
Sample use, including value parsed, its type, and standard method str.isnumeric():
<langsyntaxhighlight lang="python">def numeric(literal):
"""Return value of numeric literal or None if can't parse a value"""
castings = [int, float, complex,
Line 3,841 ⟶ 4,107:
for s in tests:
print("%14s -> %-14s %-20s is_numeric: %-5s str.isnumeric: %s" % (
'"'+s+'"', numeric(s), type(numeric(s)), is_numeric(s), s.isnumeric() ))</langsyntaxhighlight>
{{out}}
<pre>
Line 3,876 ⟶ 4,142:
 
===Python: Regular expressions===
<langsyntaxhighlight lang="python">import re
numeric = re.compile('[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?')
is_numeric = lambda x: numeric.fullmatch(x) != None
 
is_numeric('123.0')</langsyntaxhighlight>
 
=={{header|Quackery}}==
 
<langsyntaxhighlight Quackerylang="quackery"> [ char . over find
tuck over found iff
[ swap pluck drop ]
Line 3,897 ⟶ 4,163:
$ "152" task
$ "-3.1415926" task
$ "Foo123" task</langsyntaxhighlight>
 
{{out}}
Line 3,907 ⟶ 4,173:
=={{header|R}}==
 
<langsyntaxhighlight Rlang="r">> strings <- c("152", "-3.1415926", "Foo123")
> suppressWarnings(!is.na(as.numeric(strings)))
[1] TRUE TRUE FALSE
</syntaxhighlight>
</lang>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">(define (string-numeric? s) (number? (string->number s)))</langsyntaxhighlight>
Or, since all non-<tt>#f</tt> are true:
<langsyntaxhighlight lang="racket">(define string-numeric? string->number)</langsyntaxhighlight>
 
=={{header|Raku}}==
Line 3,924 ⟶ 4,190:
Note: These routines are usable for most cases but won't detect unicode non-digit numeric forms; E.G. vulgar fractions, Roman numerals, circled numbers, etc. If it is necessary to detect those as numeric, a full fledged grammar may be necessary.
 
<syntaxhighlight lang="raku" perl6line>sub is-number-w-ws( Str $term --> Bool ) { # treat Falsey strings as numeric
$term.Numeric !~~ Failure;
}
Line 3,937 ⟶ 4,203:
"<$_>", .&is-number-w-ws, .&is-number-wo-ws for
(|<1 1.2 1.2.3 -6 1/2 12e B17 1.3e+12 1.3e12 -2.6e-3 zero 0x 0xA10 0b1001 0o16
0o18 2+5i True False Inf NaN 0x10.50 0b102 0o_5_3 ௫௯>, ' 12 ', '1 1 1', '', ' ' ).map: *.Str;</langsyntaxhighlight>
 
<pre> Coerce Don't coerce
Line 3,972 ⟶ 4,238:
 
=={{header|RapidQ}}==
<langsyntaxhighlight RapidQlang="rapidq">isnumeric
$Typecheck on
 
Line 4,021 ⟶ 4,287:
showmessage (str$(isNumeric("-152.34","")))
end
</syntaxhighlight>
</lang>
 
=={{header|REBOL}}==
<syntaxhighlight lang="rebol">
<lang REBOL>
REBOL [
Title: "Is Numeric?"
Line 4,058 ⟶ 4,324:
} none
foreach x cases [print [x numeric? x pnumeric? x]]
</syntaxhighlight>
</lang>
 
=={{header|Retro}}==
Retro does not have floating point numbers as part of the core system. For others, this can be done with:
 
<langsyntaxhighlight Retrolang="retro">'123 a:from-string TRUE [ swap c:digit? and ] a:reduce</langsyntaxhighlight>
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">/*REXX program determines if a string is numeric, using REXX's rules for numbers. */
yyy=' -123.78' /*or some such. */
 
Line 4,113 ⟶ 4,379:
/*note: REXX only looks at the first char for DATATYPE's 2nd argument.*/
 
/*note: some REXX interpreters don't support the ¬ (not) character. */</langsyntaxhighlight>
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
see isdigit("0123456789") + nl + # print 1
isdigit("0123a") # print 0
</syntaxhighlight>
</lang>
 
=={{header|RPL}}==
This one-liner returns 1 if the string is either a real number, a complex number or a binary integer - and zero otherwise.
≪ '''IFERR''' STR→ '''THEN''' DROP 0 '''ELSE''' TYPE { 0 1 10 } SWAP POS SIGN '''END''' ≫ ‘<span style="color:blue">NUM?</span>’ STO
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">def is_numeric?(s)
begin
Float(s)
Line 4,130 ⟶ 4,400:
true # numeric
end
end</langsyntaxhighlight>
 
or more compact:
 
<langsyntaxhighlight lang="ruby">def is_numeric?(s)
!!Float(s) rescue false
end</langsyntaxhighlight>
 
'''NB!''' Since Ruby 2.6 you no longer need `rescue`:
 
<langsyntaxhighlight lang="ruby">def is_numeric?(s)
!!Float(s, exception: false)
end</langsyntaxhighlight>
 
Adding `exception: false` will make it return `nil` instead.
 
'''sample'''
<langsyntaxhighlight lang="ruby">strings = %w(0 0.0 -123 abc 0x10 0xABC 123a -123e3 0.1E-5 50e)
strings.each do |str|
puts "%9p => %s" % [str, is_numeric?(str)]
end</langsyntaxhighlight>
{{out}}
<pre>
Line 4,166 ⟶ 4,436:
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang="runbasic">print isNumeric("123")
print isNumeric("1ab")
 
Line 4,189 ⟶ 4,459:
[nxtDigit]
next i
END FUNCTION</langsyntaxhighlight><pre>123 1
1ab 0</pre>
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">// This function is not limited to just numeric types but rather anything that implements the FromStr trait.
fn parsable<T: FromStr>(s: &str) -> bool {
s.parse::<T>().is_ok()
}</langsyntaxhighlight>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">
import scala.util.control.Exception.allCatch
 
def isNumber(s: String): Boolean = (allCatch opt s.toDouble).isDefined
</syntaxhighlight>
</lang>
 
<langsyntaxhighlight lang="scala">
def isNumeric(input: String): Boolean = input.forall(_.isDigit)
</syntaxhighlight>
</lang>
 
Or a more complete version, using a complex regular expression:
<langsyntaxhighlight lang="scala">
def isNumeric2(str: String): Boolean = {
str.matches(s"""[+-]?((\d+(e\d+)?[lL]?)|(((\d+(\.\d*)?)|(\.\d+))(e\d+)?[fF]?))""")
}
</syntaxhighlight>
</lang>
 
Or using the built-in number parsing and catching exceptions:
<langsyntaxhighlight lang="scala">
def isNumeric(str: String): Boolean = {
!throwsNumberFormatException(str.toLong) || !throwsNumberFormatException(str.toDouble)
Line 4,225 ⟶ 4,495:
try { f; false } catch { case e: NumberFormatException => true }
}
</syntaxhighlight>
</lang>
 
=={{header|Scheme}}==
string->number returns #f when the string is not numeric and otherwise the number, which is non-#f and therefore true.
<langsyntaxhighlight lang="scheme">(define (numeric? s) (string->number s))</langsyntaxhighlight>
 
=={{header|Seed7}}==
Line 4,235 ⟶ 4,505:
GetNumber reads a numeric literal from a string. The numeric literal is removed from the input string.
 
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
include "scanstri.s7i";
 
Line 4,246 ⟶ 4,516:
numberStri := getNumber(stri);
isNumeric := stri = "";
end func;</langsyntaxhighlight>
 
=={{header|Sidef}}==
There is the the ''String.looks_like_number'' method, which returns true when a given strings looks like a number:
<langsyntaxhighlight lang="ruby">say "0.1E-5".looks_like_number; #=> true</langsyntaxhighlight>
 
Alternatively, we can use regular expressions to determine this:
 
<langsyntaxhighlight lang="ruby">func is_numeric(s) {
(s ~~ /^[+-]?+(?=\.?[0-9])[0-9_]*+(?:\.[0-9_]++)?(?:[Ee](?:[+-]?+[0-9_]+))?\z/) ||
(s ~~ /^0(?:b[10_]*|x[0-9A-Fa-f_]*|[0-9_]+\b)\z/)
}</langsyntaxhighlight>
 
Sample:
<langsyntaxhighlight lang="ruby">var strings = %w(0 0.0 -123 abc 0x10 0xABC 123a -123e3 0.1E-5 50e);
for str in strings {
say ("%9s => %s" % (str, is_numeric(str)))
}</langsyntaxhighlight>
{{out}}
<pre>
Line 4,281 ⟶ 4,551:
Simula uses the '&' instead of 'e' or 'E' for the exponent part of a floating point decimal number.
 
<langsyntaxhighlight lang="simula">BEGIN
 
BOOLEAN PROCEDURE ISNUMERIC(W); TEXT W;
Line 4,355 ⟶ 4,625:
 
END
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 4,384 ⟶ 4,654:
The String class has the method <code>isNumeric</code>; this method (at least on version 3.0.4) does not recognize as number strings like '-123'! So I've written an extension...
 
<langsyntaxhighlight lang="smalltalk">String extend [
realIsNumeric [
(self first = $+) |
Line 4,403 ⟶ 4,673:
'-3.78.23'. "false"
'123e3' "false: the notation is not recognized"
} do: [ :a | a realIsNumeric printNl ]</langsyntaxhighlight>
 
{{works with|Smalltalk/X}}
{{works with|GNU Smalltalk}}
(should work with all)
<langsyntaxhighlight lang="smalltalk">(Number readFrom:(aString readStream) onError:[nil]) notNil</langsyntaxhighlight>
to handle radix numbers (such as 2r10111), use:
<langsyntaxhighlight lang="smalltalk">(Scanner scanNumberFrom:(aString readStream)) notNil</langsyntaxhighlight>
 
=={{header|SNOBOL4}}==
This task is easy in Snobol. Use the convert( ) function as a predicate returning success (T) or failure (F) for string to real conversion.
 
<langsyntaxhighlight Snobol4lang="snobol4"> define('nchk(str)') :(nchk_end)
nchk convert(str,'real') :s(return)f(freturn)
nchk_end
Line 4,434 ⟶ 4,704:
output = isnum('abc')
output = isnum('A440')
end</langsyntaxhighlight>
 
{{out}}
Line 4,448 ⟶ 4,718:
=={{header|SQL}}==
{{works with|MS SQL|Server 2005}}
<langsyntaxhighlight lang="sql">declare @s varchar(10)
set @s = '1234.56'
 
Line 4,454 ⟶ 4,724:
 
if isnumeric(@s)=1 begin print 'Numeric' end
else print 'Non-numeric'</langsyntaxhighlight>
 
=={{header|SQL PL}}==
{{works with|Db2 LUW}} version 9.7 or higher.
With SQL PL:
<langsyntaxhighlight lang="sql pl">
--#SET TERMINATOR @
 
Line 4,488 ⟶ 4,758:
VALUES IS_NUMERIC('')@
VALUES IS_NUMERIC(' ')@
</syntaxhighlight>
</lang>
Output:
<pre>
Line 4,570 ⟶ 4,840:
 
=={{header|Standard ML}}==
<langsyntaxhighlight lang="sml">(* this function only recognizes integers in decimal format *)
fun isInteger s = case Int.scan StringCvt.DEC Substring.getc (Substring.full s) of
SOME (_,subs) => Substring.isEmpty subs
Line 4,579 ⟶ 4,849:
| NONE => false
 
fun isNumeric s = isInteger s orelse isReal s</langsyntaxhighlight>
 
=={{header|Swift}}==
{{works with|Swift|2.x+}}
<langsyntaxhighlight lang="swift">func isNumeric(a: String) -> Bool {
return Double(a) != nil
}</langsyntaxhighlight>
 
{{works with|Swift|1.x}}
This one only checks whether it is an integer:
<langsyntaxhighlight lang="swift">func isNumeric(a: String) -> Bool {
return a.toInt() != nil
}</langsyntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc isNumeric str {string is double -strict $str}</langsyntaxhighlight>
 
=={{header|TMG}}==
Unix TMG dialect. NOTE: the program also performs some basic normalization (namely, removing the plus sign and translating "E" to "e"):
<langsyntaxhighlight UnixTMGlang="unixtmg">prog: ignore(<< >>)
parse(line)\prog
parse(error)\prog;
Line 4,617 ⟶ 4,887:
none: <<>>;
nonl: !<<
>>;</langsyntaxhighlight>
 
Sample input:
Line 4,659 ⟶ 4,929:
Returns a flag of TRUE if character-string parameter represents a signed or unsigned integer. Otherwise returns a flag of FALSE. The success or failure is dependent on the source is valid in the current numeric base. The '''>number''' function also recognizes several optional prefixes for overriding the current base during conversion.
 
<langsyntaxhighlight lang="toka">[ ( string -- flag )
>number nip ] is isNumeric
 
Line 4,668 ⟶ 4,938:
" a" isNumeric . ( fails, 'a' is not a valid integer in the decimal base )
" $a" isNumeric . ( succeeds, because $ is a valid override prefix )
( denoting that the following character is a hexadecimal number )</langsyntaxhighlight>
 
 
=={{header|True BASIC}}==
{{trans|RapidQ}}
<langsyntaxhighlight lang="basic">
DECLARE FUNCTION isnumeric$
 
Line 4,736 ⟶ 5,006:
END FUNCTION
END
</syntaxhighlight>
</lang>
 
 
=={{header|UNIX Shell}}==
<langsyntaxhighlight lang="bash">
#!/bin/bash
isnum() {
Line 4,762 ⟶ 5,032:
check 33.aa
check 3.3.3
</syntaxhighlight>
</lang>
 
{{out}}
Line 4,775 ⟶ 5,045:
 
=={{header|Ursa}}==
<langsyntaxhighlight lang="ursa">def isnum (string str)
try
double str
Line 4,782 ⟶ 5,052:
return false
end try
end isnum</langsyntaxhighlight>
 
=={{header|VBA}}==
Line 4,788 ⟶ 5,058:
So we have to check the "." or "," and replace it by the Application.DecimalSeparator.
 
<langsyntaxhighlight lang="vb">Sub Main()
Debug.Print Is_Numeric("")
Debug.Print Is_Numeric("-5.32")
Line 4,803 ⟶ 5,073:
Other = IIf(Separat = ",", ".", ",")
Is_Numeric = IsNumeric(Replace(s, Other, Separat))
End Function</langsyntaxhighlight>
 
=={{header|VBScript}}==
<syntaxhighlight lang ="vb">IsNumeric(Expr)</langsyntaxhighlight>
 
Returns a True if numeric and a false if not.
Line 4,814 ⟶ 5,084:
Only signed and unsigned integers are recognized, in decimal, hex (preceded with 0x) or octal (preceded with 0o).
Remove the SUPPRESS option to evaluate an expression instead of single numeric value.
<langsyntaxhighlight lang="vedit">:IS_NUMERIC:
if (Num_Eval(SUPPRESS)==0 && Cur_Char != '0') {
Return(FALSE)
} else {
Return(TRUE)
}</langsyntaxhighlight>
 
=={{header|Visual Basic .NET}}==
{{works with|Visual Basic .NET|2005}}
<langsyntaxhighlight lang="vbnet">Dim Value As String = "+123"
 
If IsNumeric(Value) Then
PRINT "It is numeric."
End If</langsyntaxhighlight>
 
=={{header|V (Vlang)}}==
<syntaxhighlight lang="v (vlang)">import strconv
 
fn is_numeric(s string) bool {
strconv.atof64(s) or {
return false
}
return true
}
 
fn main() {
println("Are these strings numeric?")
strings := ["1", "3.14", "-100", "1e2", "NaN", "rose", "0xff", "0b110"]
for s in strings {
println(" ${s:4} -> ${is_numeric(s)}")
}
}</syntaxhighlight>
 
{{out}}
<pre>
Are these strings numeric?
1 -> true
3.14 -> true
-100 -> true
1e2 -> true
NaN -> false
rose -> false
0xff -> true
0b110 -> true
</pre>
 
=={{header|Wren}}==
{{libheader|Wren-fmt}}
Wren's Num class already has a static method which does what this task requires.
<langsyntaxhighlight ecmascriptlang="wren">import "./fmt" for Fmt
 
System.print("Are these strings numeric?")
Line 4,839 ⟶ 5,140:
var i = Num.fromString(s) // returns null if 's' is not numeric
System.print(" %(Fmt.s(4, s)) -> %((i != null) ? "yes" : "no")")
}</langsyntaxhighlight>
 
{{out}}
Line 4,855 ⟶ 5,156:
=={{header|XLISP}}==
The inbuilt function <tt>STRING->NUMBER</tt> returns the numeric value of a string if it can. We discard this value and return the Boolean value 'true'; otherwise, the <tt>IF</tt> conditional will not be satisfied and will return 'false'.
<langsyntaxhighlight lang="xlisp">(DEFUN NUMERICP (X)
(IF (STRING->NUMBER X) T))</langsyntaxhighlight>
 
=={{header|XPL0}}==
The compiler is more strict in the characters it accepts as numeric than
what is accepted here. This program indicates more of what the input
intrinsics (IntIn, RlIn and HexIn) would accept as numeric.
<syntaxhighlight lang "XPL0">string 0;
 
func IsNumeric(Str);
char Str;
[while Str(0) # 0 do
[if Str(0) >= ^0 and Str(0) <= ^9 then return true;
if Str(0) = ^$ then
[if Str(1) >= ^0 and Str(1) <= ^9 then return true;
if Str(1) >= ^A and Str(1) <= ^F then return true;
if Str(1) >= ^a and Str(1) <= ^f then return true;
];
Str:= Str+1;
];
return false;
];
 
int Strs, S;
[Text(0, "Are these strings numeric?^m^j");
Strs:= ["1", "3.14", "-100", "1e2", "NaN", "$af", "%1_1011", "rose", ". 3", "num9", "x$ 9", "x$ a"];
for S:= 0 to 12-1 do
[Text(0, if IsNumeric(Strs(S)) then "yes : " else "no : ");
Text(0, Strs(S));
CrLf(0);
];
]</syntaxhighlight>
{{out}}
<pre>
Are these strings numeric?
yes : 1
yes : 3.14
yes : -100
yes : 1e2
no : NaN
yes : $af
yes : %1_1011
no : rose
yes : . 3
yes : num9
yes : x$ 9
no : x$ a
</pre>
 
=={{header|Z80 Assembly}}==
{{works with|CP/M 3.1|YAZE-AG-2.51.2 Z80 emulator}}
{{works with|ZSM4 macro assembler|YAZE-AG-2.51.2 Z80 emulator}}
Use the /S8 switch on the ZSM4 assembler for 8 significant characters for labels and names
<syntaxhighlight lang="z80">
;
; Check if input string is a number using Z80 assembly language
;
; Runs under CP/M 3.1 on YAZE-AG-2.51.2 Z80 emulator
; Assembled with zsm4 on same emulator/OS, uses macro capabilities of said assembler
; Created with vim under Windows
;
; 2023-04-04 Xorph
;
 
;
; Useful definitions
;
 
bdos equ 05h ; Call to CP/M BDOS function
strdel equ 6eh ; Set string delimiter
readstr equ 0ah ; Read string from console
wrtstr equ 09h ; Write string to console
 
nul equ 00h ; ASCII control characters
esc equ 1bh
cr equ 0dh
lf equ 0ah
 
cnull equ '0' ; ASCII character constants
cnine equ '9'
cminus equ '-'
cdot equ '.'
 
buflen equ 30h ; Length of input buffer
minbit equ 00h ; Bit 0 is used as flag for '-'
dotbit equ 01h ; Bit 1 is used as flag for '.'
 
;
; Macros for BDOS calls
;
 
setdel macro char ; Set string delimiter to char
ld c,strdel
ld e,char
call bdos
endm
 
print macro msg ; Output string to console
ld c,wrtstr
ld de,msg
call bdos
endm
 
newline macro ; Print newline
ld c,wrtstr
ld de,crlf
call bdos
endm
 
readln macro buf ; Read a line from input
ld c,readstr
ld de,buf
call bdos
endm
 
;
; =====================
; Start of main program
; =====================
;
 
cseg
 
isnum:
setdel nul ; Set string terminator to nul ('\0') - '$' is default in CP/M
print help
newline
newline
 
readnum:
ld b,buflen ; Clear input buffer
ld hl,bufcont
clrloop:
ld (hl),0
inc hl
djnz clrloop
 
readln inputbuf ; Read a line from input
newline ; Newline is discarded during input, so write one...
 
ld a,(inputbuf+1) ; Length of actual input
cp 0 ; If empty input, quit
ret z
 
ld b,a ; Loop counter for djnz instruction
ld c,0 ; Use c for flags: '-' and '.' may be encountered at most once, '-' only at start
ld hl,bufcont ; Start of actual input
 
loop:
ld a,(hl) ; Get next character into a
 
cp cminus ; Check minus sign
jr z,chkminus
 
cp cdot ; Check dot
jr z,chkdot
 
cp cnull ; Check if below '0'
jr c,notanum
 
cp cnine+1 ; Check if above '9'
jr nc,notanum
 
checknxt:
set minbit,c ; Whatever the case, no more '-' are allowed after the first character
inc hl ; Increase hl to next character and repeat until done
djnz loop
 
print bufcont ; If we made it this far, we are done and the string is numeric
print yesmsg
newline
newline
 
done:
jp readnum ; Read next input from user until terminated with ^C or empty input
ret ; Return to CP/M (unreachable code)
 
notanum:
print bufcont ; Print failure message
print nomsg
newline
newline
jr done
 
chkminus:
bit minbit,c ; If a '-' is encountered and the flag is already set, the string is not numeric
jr nz,notanum
set minbit,c ; Otherwise, set flag and check next character
jr checknxt
 
chkdot:
bit dotbit,c ; If a '.' is encountered and the flag is already set, the string is not numeric
jr nz,notanum
set dotbit,c ; Otherwise, set flag and check next character
jr checknxt
 
;
; ===================
; End of main program
; ===================
;
 
;
; ================
; Data definitions
; ================
;
 
dseg
 
help:
defz 'Enter numbers to check, end with empty line or ^C'
 
inputbuf: ; Input buffer for CP/M BDOS call
defb buflen ; Maximum possible length
defb 00h ; Returned length of actual input
bufcont:
defs buflen ; Actual input area
defb nul ; Null terminator for output, if buffer is filled completely
 
yesmsg:
defz ' is numeric'
nomsg:
defz ' is not numeric'
 
crlf: defb cr,lf,nul ; Generic newline
 
</syntaxhighlight>
 
{{out}}
<pre>
E>isnum
Enter numbers to check, end with empty line or ^C
 
1234
1234 is numeric
 
hello
hello is not numeric
 
12.34
12.34 is numeric
 
-98.76
-98.76 is numeric
 
4.6.76
4.6.76 is not numeric
 
34-56-23
34-56-23 is not numeric
 
-.9876543210
-.9876543210 is numeric
 
444555.
444555. is numeric
 
1234c
1234c is not numeric
 
123e45
123e45 is not numeric
 
</pre>
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn isNum(text){
try{ text.toInt(); True }
catch{ try{ text.toFloat(); True }
catch{ False }
}
}</langsyntaxhighlight>
<pre>
isNum("123.4") //-->True
Line 4,876 ⟶ 5,440:
 
=={{header|Zoea}}==
<syntaxhighlight lang="zoea">
<lang Zoea>
program: numeric
case: 1 input: '1' output: true
Line 4,884 ⟶ 5,448:
case: 5 input: 'Fred' output: false
case: 6 input: '' output: false
</syntaxhighlight>
</lang>
 
=={{header|Zoea Visual}}==
3

edits