17
$\begingroup$

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.

$\endgroup$
2

9 Answers 9

19
$\begingroup$
 StringCases["thiru3", x : NumberString :> ToExpression[x]]
 (* {3} *)
 First[%]
 (* 3 *)
 {NumberQ[%], Head[%]}
 (* {True, Integer} *)
$\endgroup$
2
  • 1
    $\begingroup$ As noted by ssch in Chris's answer, FromDigits[] might be better to use than ToExpression[]. $\endgroup$ Apr 4, 2013 at 14:55
  • 1
    $\begingroup$ 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. $\endgroup$
    – Michael E2
    Oct 16, 2013 at 12:09
12
$\begingroup$

Try to use ToExpression, like this

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

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

$\endgroup$
11
$\begingroup$

Alternatively, and for multiple numbers:-

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

{3, 7}

Latterly

ToExpression@StringCases["thiru37", DigitCharacter]

{3, 7}

$\endgroup$
1
  • 2
    $\begingroup$ 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 $\endgroup$
    – ssch
    Dec 22, 2012 at 19:23
9
$\begingroup$

Here is one compact option

Internal`StringToDouble@"thiru3"

3.

$\endgroup$
2
3
$\begingroup$

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.

$\endgroup$
3
$\begingroup$

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

$\endgroup$
2
  • 1
    $\begingroup$ StringCases["thiru37aa2er45", x : DigitCharacter .. :> FromDigits[x]] $\endgroup$
    – Mr.Wizard
    Oct 16, 2013 at 11:15
  • $\begingroup$ @Mr.Wizard thank you...all in one step $\endgroup$
    – ubpdqn
    Oct 16, 2013 at 11:40
2
$\begingroup$
s = "thiru3";
r = First@StringCases[s, RegularExpression["\\d+"]];
Needs["JLink`"];
InstallJava[];
LoadJavaClass["java.lang.Integer"];
z = Integer`parseInt[r]
Head[z]

Mathematica graphics

$\endgroup$
3
  • $\begingroup$ bbbut... why not ToExpression@r? $\endgroup$
    – rm -rf
    Dec 22, 2012 at 23:07
  • 1
    $\begingroup$ @rm-rf The sarcasm character doesn't display in your browser I guess. $\endgroup$ Dec 22, 2012 at 23:13
  • 5
    $\begingroup$ wish I could upvote twice. what an economical solution $\endgroup$
    – acl
    Dec 23, 2012 at 0:50
1
$\begingroup$

Can be so

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

or

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

or

ToExpression[StringCases["thiru3", RegularExpression["\\d+"]][[1]]]
$\endgroup$
0
$\begingroup$

Try this.

Read[StringToStream[StringTake["thiru3", {6, 6}]]]
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.