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$
19
$\begingroup$
 StringCases["thiru3", x : NumberString :> ToExpression[x]]
 (* {3} *)
 First[%]
 (* 3 *)
 {NumberQ[%], Head[%]}
 (* {True, Integer} *)
| improve this answer | |
$\endgroup$
  • 1
    $\begingroup$ As noted by ssch in Chris's answer, FromDigits[] might be better to use than ToExpression[]. $\endgroup$ – J. M.'s discontentment 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

| improve this answer | |
$\endgroup$
11
$\begingroup$

Alternatively, and for multiple numbers:-

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

{3, 7}

Latterly

ToExpression@StringCases["thiru37", DigitCharacter]

{3, 7}

| improve this answer | |
$\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.

| improve this answer | |
$\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.

| improve this answer | |
$\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

| improve this answer | |
$\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

| improve this answer | |
$\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]]]
| improve this answer | |
$\endgroup$
0
$\begingroup$

Try this.

Read[StringToStream[StringTake["thiru3", {6, 6}]]]
| improve this answer | |
$\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.