16
$\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$
18
$\begingroup$
 StringCases["thiru3", x : NumberString :> ToExpression[x]]
 (* {3} *)
 First[%]
 (* 3 *)
 {NumberQ[%], Head[%]}
 (* {True, Integer} *)
$\endgroup$
  • 1
    $\begingroup$ As noted by ssch in Chris's answer, FromDigits[] might be better to use than ToExpression[]. $\endgroup$ – J. M. will be back soon Apr 4 '13 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 '13 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$
  • 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 '12 at 19:23
9
$\begingroup$

Here is one compact option

Internal`StringToDouble@"thiru3"

3.

$\endgroup$
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$
  • 1
    $\begingroup$ StringCases["thiru37aa2er45", x : DigitCharacter .. :> FromDigits[x]] $\endgroup$ – Mr.Wizard Oct 16 '13 at 11:15
  • $\begingroup$ @Mr.Wizard thank you...all in one step $\endgroup$ – ubpdqn Oct 16 '13 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$
  • $\begingroup$ bbbut... why not ToExpression@r? $\endgroup$ – rm -rf Dec 22 '12 at 23:07
  • 1
    $\begingroup$ @rm-rf The sarcasm character doesn't display in your browser I guess. $\endgroup$ – Sjoerd C. de Vries Dec 22 '12 at 23:13
  • 5
    $\begingroup$ wish I could upvote twice. what an economical solution $\endgroup$ – acl Dec 23 '12 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, privacy policy and cookie policy

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