Chris Bunch
Chris Bunch

Reputation: 89953

Ruby - Convert Integer to String

In Ruby, trying to print out the individual elements of a String is giving me trouble. Instead of seeing each character, I'm seeing their ASCII values instead:

>> a = "0123"
=> "0123"
>> a[0]
=> 48

I've looked online but can't find any way to get the original "0" back out of it. I'm a little new to Ruby to I know it has to be something simple but I just can't seem to find it.

Upvotes: 17

Views: 12466

Answers (7)

SCdF
SCdF

Reputation: 59428

You want a[0,1] instead of a[0].

Upvotes: 7

John La Rooy
John La Rooy

Reputation: 304493

I think each_char or chars describes better what you want.

irb(main):001:0> a = "0123"
=> "0123"
irb(main):002:0> Array(a.each_char)
=> ["0", "1", "2", "3"]
irb(main):003:0> puts Array(a.each_char)
0
1
2
3
=> nil

Upvotes: 0

Nathan Fritz
Nathan Fritz

Reputation: 2338

To summarize:

This behavior will be going away in version 1.9, in which the character itself is returned, but in previous versions, trying to reference a single character of a string by its character position will return its character value (so "ABC"[2] returns 67)

There are a number of methods that return a range of characters from a string (see the Ruby docs on the String slice method) All of the following return "C":

"ABC"[2,1] 
"ABC"[2..2]
"ABC".slice(2,1)

I find the range selector to be the easiest to read. Can anyone speak to whether it is less efficient?

Upvotes: 5

Ben Childs
Ben Childs

Reputation: 4590

The [,] operator returns a string back to you, it is a substring operator, where as the [] operator returns the character which ruby treats as a number when printing it out.

Upvotes: 2

Joseph Pecoraro
Joseph Pecoraro

Reputation: 2876

Or you can convert the integer to its character value:

a[0].chr

Upvotes: 15

SCdF
SCdF

Reputation: 59428

@Chris,

That's just how [] and [,] are defined for the String class.

Check out the String API.

Upvotes: 1

Stuart
Stuart

Reputation: 323

I believe this is changing in Ruby 1.9 such that "asdf"[2] yields "d" rather than the character code

Upvotes: 6

Related Questions