Looking for the best way to take an arbitrary number with potentially repeating decimal part, and discover the repeating part (if present).
Ultimately, I need to decorate the number with overline notation (either with css text-decoration or MathML mline), so I need to know the index of where the repetition begins also.
So I need regex that will get me (or can be used in an algorithm to get) the following results:
1.333 // result: {"pattern": 3, index: 0} 1.5444 // result: {"pattern": 4, index: 1} 1.123123 // result: {"pattern": 123, index: 0} 1.5432121212 // result: {"pattern": 12, index: 4} 1.321 // result: null 1.44212 // result: null
Additional Example (from comments):
1.3333 // result: { "pattern": 3, index: 0}
Advertisement
Answer
function getRepetend(num) { var m = (num+'').match(/.(d*?)(d+?)2+$/); return m && {pattern: +m[2], index: m[1].length}; }
It works like this:
- First, convert the number to string in order to be able to use regular expressions.
- Then, match this regex:
/.(d*?)(d+)2+$/
:.
matches the decimal dot.(d*?)
matches the digits between the decimal dot and the repetend, and captures the result into backreference number 1.(d+?)
matches the repetend, and captures it into backreference number 2.2+
matches repetitions of the repetend.$
matches end of string.
- Finally, if the match is
null
(i.e. there is no match), returnnull
. - Otherwise, return an object that contains the repetend (backreference 2) converted to number, and the number of digits between the dot and the repetend (backreference 1).