Refactor method to add commas to a string of numbers [duplicate] - ruby

This question already has answers here:
How to format a number 1000 as "1 000"
(12 answers)
Closed 8 years ago.
I was working on a method to add commas to a number that is passed. I.E. separate_commas(1000) would return "1,000" or separate_commas(100000) would return "100,000"...etc.
Now that I've solved it, I'm wondering how I could refactor without regular expressions. Would appreciate suggestions, thank you in advance. Ruby 2.1.1p76
def separate_comma(x)
x=x.to_s
len=-4
until len.abs > x.length
x.insert(len, ',')
len-=4
end
return x
end

Not exactly pretty, but it is a little more ruby-esque
num.to_s.reverse
.split('').each_slice(3).to_a
.map{|num| num.reverse.join('')}.reverse.join(',')

Related

Regex to extract iso code in a string in ruby [duplicate]

This question already has answers here:
How do I find if a string starts with another string in Ruby?
(4 answers)
Closed 3 years ago.
image_basename = 'fr-ca-test.png'
Langs = {'ca', 'fr-CA', 'en-CA'}
Langs.each do |locale_code|
return locale_code /(\b|\_|-)#{locale_code}(\b|\_|-)/i.match(image_basename)
end
end
When the filename contains fr-CA or en-CA. I would like to returns fr-CA not Ca.
How I can fix my regex?
I wouldn't use a regexp in this simple example. Using start_with? will very likely be faster and IMHO it is easier to read and to understand:
image_basename = 'fr-ca-test.png'
LANGUAGES = ['fr-CA', 'en-CA', 'ca']
LANGUAGES.find { |code| image_basename.start_with?(code.downcase) }
#=> "fr-CA"

Ruby: How Extracting Words From String [duplicate]

This question already has answers here:
Ruby: Extracting Words From String
(5 answers)
Closed 6 years ago.
I want get words from string.
For example:
str = "Mike's book.".
I wish I can get ["Mike's", "book"].
I know we can str.split(/\W+/), but it will return ["Mike", "s", "book"], that's not what I want.
Use scan() method in Ruby with character class regex including word character and single quote.
str.scan(/[\w']+/)

Ruby: how to add separator character to the last? [duplicate]

This question already has answers here:
How can I 'join' an array adding to the beginning of the resulting string the first character to join?
(6 answers)
Closed 8 years ago.
Example,
> arr = ['a', 'b', 'c']
> arr.join('-')
=> "a-b-c"
Is there any function to attach one more separator to the last?
> arr.func('-')
=> "a-b-c-"
Thank you.
No, there is no single function like that. You can just hack it like this:
arr.push('').join('-')
If you don't want to change the original array. dup it:
arr.dup.push('').join('-')
You don't actually want a join in this case, you want a reduce (commonly referenced by it's alias, inject):
arr.reduce('') { |concat, entry| concat + entry + '-' }
There are, of course, plenty of other ways of making this work, but spelling it out is less clever, and therefore a lot easier to figure out when you come back to it later (or someone else has to work on it).
Another way (just sayin'):
arr.join.gsub(/./) { |c| c + '-' }
Still like
arr.join('-') << '-'
best for its simplicity.
Modify the array.
arr.map{|c| c.concat("-")}.join

Ruby is_a?(Integer) issues [duplicate]

This question already has answers here:
How to test if a string is basically an integer in quotes using Ruby
(19 answers)
Closed 9 years ago.
I am trying to test if my variables are Integer, here is the code :
if (params[:int1].is_a?(Integer) && params[:int2].is_a?(Integer))
add(params[:int1], params[:int2])
else
puts "Need two integers"
end
If you know why it doesn't works, you have all my attention.
params= { int1: "1" }
puts params[:int1].class
> String
Your params hash probably contains string values instead of Integers. If you want to check if a string is a valid integer, you can try validating it against a regex like so:
if /\d+/=~ params[:int1]
# do stuff
end
params[] stores only strings. You need to cast them to integers.
Try something like:
params[:int1].empty? ? raise EmptyIntegerException : my_int1 = params[:int1].to_i

In Ruby, given a character code, how can I create a string / character? [duplicate]

This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
How to convert character code to what I want?
I am positive this has to be a duplicate, but all search results were in other languages or were the reverse (character to code point).
e.g.
charCode = 96
string = # ... ?
You could do it with:
string = charCode.chr
The .chr method on Fixnum.
96.chr #=> "c"

Resources