# ,elegant

**URL:** <https://www.ruby-forum.com/t/elegant/100322>\
**Category:** Ruby\
**Created:** [December 13, 2005, 6:27pm UTC](https://www.ruby-forum.com/t/elegant/100322 "2005-12-13T18:27:16Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![leslieviljoen](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/3d9bf3/32.png) [@leslieviljoen](https://www.ruby-forum.com/u/leslieviljoen)\
**Post date:** [December 13, 2005, 6:27pm UTC](https://www.ruby-forum.com/t/elegant/100322/1 "2005-12-13T18:27:16Z")

</div>

Hiya!

This function adds commas to a string after every three characters  
so a number would be easier to read. It’s kinda ugly though, and I can’t  
help thinking there’d be a elegant Why-esque one or two liner to do  
this kind of thing - anyone care to improve it?

def add\_commas(str)  
return nil if str.class != String

ret = “”  
len = str.length  
i = len - 1  
while i \>= 0  
ret = str[i].chr + ret  
if ((len-i) % 3) == 0  
ret = “,” + ret  
end  
i -= 1  
end  
if ret[0].chr == “,”  
ret = ret[1…-1]  
end  
ret  
end

---

<div class="post-metadata">

**Author:** ![leslieviljoen](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/3d9bf3/32.png) [@leslieviljoen](https://www.ruby-forum.com/u/leslieviljoen)\
**Post date:** [December 13, 2005, 6:42pm UTC](https://www.ruby-forum.com/t/elegant/100322/2 "2005-12-13T18:42:22Z")

</div>

On Dec 13, 2005, at 11:24 AM, Leslie V. wrote:

> Hiya!
> 
> This function adds commas to a string after every three characters  
> so a number would be easier to read. It’s kinda ugly though, and I  
> can’t  
> help thinking there’d be a elegant Why-esque one or two liner to do  
> this kind of thing - anyone care to improve it?

Does this help?

[http://rubyurl.com/EOi](http://rubyurl.com/EOi)

James Edward G. II

---

<div class="post-metadata">

**Author:** ![leslieviljoen](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/3d9bf3/32.png) [@leslieviljoen](https://www.ruby-forum.com/u/leslieviljoen)\
**Post date:** [December 13, 2005, 6:48pm UTC](https://www.ruby-forum.com/t/elegant/100322/3 "2005-12-13T18:48:26Z")

</div>

James Edward G. II wrote:

> Does this help?
> 
> [http://rubyurl.com/EOi](http://rubyurl.com/EOi)
> 
> James Edward G. II

I knew it! This kind of thing makes me crazy! I used to think I was a  
good programmer!

---

<div class="post-metadata">

**Author:** ![leslieviljoen](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/3d9bf3/32.png) [@leslieviljoen](https://www.ruby-forum.com/u/leslieviljoen)\
**Post date:** [December 13, 2005, 7:00pm UTC](https://www.ruby-forum.com/t/elegant/100322/4 "2005-12-13T19:00:30Z")

</div>

On Wed, 14 Dec 2005, Leslie V. wrote:

> if ret[0].chr == “,”  
> ret = ret[1…-1]  
> end  
> ret  
> end

harp:~ \> cat a.rb  
def commafy s  
s.to\_s.reverse.scan(%r/.{1,3}/).join(’,’).reverse  
end

p(commafy(’’))  
p(commafy(‘4’))  
p(commafy(‘42’))  
p(commafy(‘422’))  
p(commafy(‘4242’))  
p(commafy(‘42424’))  
p(commafy(‘424242’))  
p(commafy(‘4242424’))

harp:~ \> ruby a.rb  
“”  
“4”  
“42”  
“422”  
“4,242”  
“42,424”  
“424,242”  
“4,242,424”

if you want you can play with the pattern so the two reverses aren’t  
needed…  
but this is quicker to write 😉

-a
