Feature #4787
closedInteger#each_modulo(n)
Description
I suggest a new feature of Integer to enumerate by iterated Integer#modulo.
An example implementation in Ruby is the following code:
class Integer
def each_modulo(n)
raise ArgumentError, "argument must be an Integer" unless n.is_a? Integer
raise ArgumentError, "argument must be larger than 1" if n <= 1
return Enumerator.new(self, :each_modulo, n) unless block_given?
q = self
while q > 0
q, r = q.divmod(n)
yield(r)
end
end
end
p 133.each_modulo(3).to_a #=> [1, 2, 2, 1, 1]
The following code is an example use of the feature:
class Integer
def each_thousand_separation
each_modulo(1000)
end
def thousand_separated_string(sep=',')
each_thousand_separation.map(&'%03d'.method(:%)).inject{|s, n| n + sep + s }
end
end
p 100_000_000_200.thousand_separated_string #=> "100,000,000,200"
I make an implementation in C, and attach the patch for that.
Files
Updated by mrkn (Kenta Murata) almost 15 years ago
- ruby -v changed from ruby 1.9.3dev (2011-05-27 trunk 31745) [x86_64-darwin10.7.0] to -
Hi,
I believe I've sent the following feature request to ruby-core,
but I sent to ruby-dev by mistake.
--
Kenta Murata
Sent with Sparrow (http://www.sparrowmailapp.com)
Forwarded Message:
From: Kenta Murata muraken@gmail.com
In Reply To: ruby-dev@ruby-lang.org
To: ruby developers list ruby-dev@ruby-lang.org
Date: 2011-05-27 13:21:06
Subject: [ruby-dev:43586] [Ruby 1.9 - Bug #4787][Open] Integer#each_modulo(n)Issue #4787 has been reported by Kenta Murata.
Bug #4787: Integer#each_modulo(n)
http://redmine.ruby-lang.org/issues/4787Author: Kenta Murata
Status: Open
Priority: Normal
Assignee: Yukihiro Matsumoto
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3dev (2011-05-27 trunk 31745) [x86_64-darwin10.7.0]I suggest a new feature of Integer to enumerate by iterated Integer#modulo.
An example implementation in Ruby is the following code:class Integer
def each_modulo(n)
raise ArgumentError, "argument must be an Integer" unless n.is_a? Integer
raise ArgumentError, "argument must be larger than 1" if n <= 1
return Enumerator.new(self, :each_modulo, n) unless block_given?
q = self
while q > 0
q, r = q.divmod(n)
yield(r)
end
end
endp 133.each_modulo(3).to_a #=> [1, 2, 2, 1, 1]
The following code is an example use of the feature:
class Integer
def each_thousand_separation
each_modulo(1000)
enddef thousand_separated_string(sep=',')
each_thousand_separation.map(&'%03d'.method(:%)).inject{|s, n| n + sep + s }
end
endp 100_000_000_200.thousand_separated_string #=> "100,000,000,200"
I make an implementation in C, and attach the patch for that.
Updated by nobu (Nobuyoshi Nakada) over 14 years ago
- Tracker changed from Bug to Feature
Updated by matz (Yukihiro Matsumoto) over 14 years ago
- Target version changed from 1.9.3 to 2.0.0
Updated by trans (Thomas Sawyer) over 14 years ago
Why not just let #modulo/#divmod take a block, rather than define a new method?
Updated by shyouhei (Shyouhei Urabe) almost 14 years ago
- Status changed from Open to Assigned
Updated by yhara (Yutaka HARA) over 13 years ago
- Target version changed from 2.0.0 to 2.6
Updated by mrkn (Kenta Murata) almost 10 years ago
- Related to Feature #12116: `Fixnum#divmod`, `Bignum#divmod` with multiple arguments added
Updated by mrkn (Kenta Murata) almost 10 years ago
- Related to Feature #12447: Integer#digits for extracting digits of place-value notation in any base added
Updated by nobu (Nobuyoshi Nakada) almost 10 years ago
- Description updated (diff)
Updated by duerst (Martin Dürst) almost 10 years ago
This only gives the 'mod' part. Why not extend this to get both the 'div' part and the 'mod' part back (see also comment #4)?
And why not allow an array of integers as an argument? Some conventions for displaying large numbers with separators are not uniform, in particular in India (see https://en.wikipedia.org/wiki/Indian_numbering_system).
Updated by mrkn (Kenta Murata) over 8 years ago
- Status changed from Assigned to Closed
This was resolved by #12447.