# How do I extract a number from a string?

I want to extract the number from an alphanumeric string. This is what I tried:

StringTake["thiru3", {6, 6}]


The result I got is 3, but it is still a String, which I determined by evaluating:

NumberQ[StringTake["thiru3", {6, 6}]]


which returns False.

-
@Mr.Wizard. I don't think it's a duplicate. This is about extracting a simple integer, not about a real an encoded in a string. – m_goldberg Feb 27 '13 at 6:04

Try to use ToExpression, like this

ToExpression[StringTake["thiru3", {6, 6}]]


If you check it with Head[%] it confirms that it is an Integer

-
 StringCases["thiru3", x : NumberString :> ToExpression[x]]
(* {3} *)
First[%]
(* 3 *)
(* {True, Integer} *)

-
As noted by ssch in Chris's answer, FromDigits[] might be better to use than ToExpression[]. – J. M. Apr 4 '13 at 14:55
NumberString will match real number strings and FromDigits will balk; ToExpression will convert them. I would say NumberString & ToExpression for real numbers, or, for integers only, DigitCharacter.. and FromDigits. You won't get messages in either case, as in ssch's comment, because FromDigits is called only when there is a match. – Michael E2 Oct 16 '13 at 12:09

Alternatively, and for multiple numbers:-

Map[FromDigits, Select[Characters["thiru37"], DigitQ]]


{3, 7}

Latterly

ToExpression@StringCases["thiru37", DigitCharacter]


{3, 7}

-
I think FromDigits is the best way since you will immediatly get a message printed in case it didn't work, that you can Check for if need be – ssch Dec 22 '12 at 19:23
s = "thiru3";
r = First@StringCases[s, RegularExpression["\\d+"]];
Needs["JLink"];
InstallJava[];
z = IntegerparseInt[r]


-
bbbut... why not ToExpression@r? – R. M. Dec 22 '12 at 23:07
@rm-rf The sarcasm character doesn't display in your browser I guess. – Sjoerd C. de Vries Dec 22 '12 at 23:13
wish I could upvote twice. what an economical solution – acl Dec 23 '12 at 0:50

Like NumberString, DigitCharacter can be used to find numbers in a string. Use relative positioning in the string (like EndOfString) to localize your digits and ignore other numbers possibly appearing at other positions:

First@StringCases["0thi12ru3", (n:DigitCharacter~~EndOfString) :> ToExpression@n]

(* ==> 3 *)


This searches for exactly one number character right before the end of string. If the terminal number could have more than one digits, use DigitCharacter.. instead.

-

Try this.

Read[StringToStream[StringTake["thiru3", {6, 6}]]]

-

Can be so

ToExpression[StringCases["thiru3", DigitCharacter ..]][[1]]


or

ToExpression[
StringCases["thiru3", "thiru" ~~ (x : DigitCharacter ..) -> x]][[1]]


or

ToExpression[StringCases["thiru3", RegularExpression["\\d+"]][[1]]]

-

Here is one compact option

InternalStringToDouble@"thiru3"


3.

-
Nice - where the heck did you get that from? – Yves Klett Oct 16 '13 at 15:03
Ahh.. I was looking for a faster way to make conversions from string to numbers, and found it here – Murta Oct 16 '13 at 22:15

Consider:

str = "thiru37aa2er45"


then

StringCases[str, DigitCharacter ..]


yields:

{"37", "2", "45"}

StringCases[str, DigitCharacter .]


yields:

{"3", "7", "2", "4", "5"}


They can be converted to expressions using ToExpression

-
StringCases["thiru37aa2er45", x : DigitCharacter .. :> FromDigits[x]]` – Mr.Wizard Oct 16 '13 at 11:15
@Mr.Wizard thank you...all in one step – ubpdqn Oct 16 '13 at 11:40