# Re: [PHP] Repeating Decimals

```How would I run the functions though and then print the repeating decimal to
the screen?```
```

----- Original Message -----
From: "Tom Rogers" <[EMAIL PROTECTED]>
To: "Stephen" <[EMAIL PROTECTED]>
Cc: "PHP List" <[EMAIL PROTECTED]>
Sent: Friday, December 06, 2002 8:38 AM
Subject: Re: [PHP] Repeating Decimals

> Hi,
>
> Friday, December 6, 2002, 5:00:07 AM, you wrote:
> S> Hello again,
>
> S> This is another PHP mathematical question. How can I display a bar over
a
> S> number (overline) if it's a repeating decimal? When the user types in 1
by
> S> 3, they get 0.333333333333. I want it to display as 0.3 with the 3
> S> overlined. How can I do this keeping in mind that not all numbers will
be
> S> repeating decimals?
>
> Did this as an exercise :)
>
> function check_to_end(\$str,\$pat){
>         \$lp = strlen(\$pat);
>         \$ls = strlen(\$str);
>         \$x = 0;
>         while(true){
>                 \$ls = strlen(\$str);
>                 if(\$ls > \$lp){//string bigger than pattern
>                         \$t = substr(\$str,0,\$lp);
>                         if(\$t != \$pat){
>                                 return false;
>                         }
>                         \$str = substr(\$str,\$lp);
>                 }else{//pattern too big .. checks tail end
>                         \$pat = substr(\$pat,0,strlen(\$str));
>                         if( \$pat != \$str) return false; //no repeat
>                         if(\$x < 2) return false; //didn't repeat enough
>                         return true; //found a pattern
>                 }
>                 \$x++;
>         }
> }
> function repeat(\$num){
>         \$s = substr(number_format(\$num,16),0,-1); //make a string
>         echo \$s;
>         list(\$a,\$b) = split('\.',\$s); //split decimal bit out
>         \$l = strlen(\$b);
>         for(\$i=0;\$i<\$l;\$i++){ //loop through string
>                 \$o = 0;
>                 \$k = \$b[\$i];    //number to find
>                 for(\$y = \$i+1;\$y<\$l;\$y++){ //loop look for same number
>                         \$c = ord(\$b[\$y]);
>                         if(ord(\$k) == ord(\$b[\$y])){ //got a match
>                                 \$pat = substr(\$b,\$i,\$y-\$i); //cut out
pattern
>                                 \$str = substr(\$b,\$i); //string to check
>                                 if(check_to_end(\$str,\$pat)){ //see if
pattern runs till the end
>                                         \$o = 1; //yep
>                                         if(ord(\$pat) == ord('0')) \$o = 2;
//were they just '0's
>                                         break;
>                                 }
>                         }
>                 }
>                 if(\$o)break; // all done
>         }
>         if(\$o == 1){ // a pattern
>                 \$r = \$a.'.'.substr(\$b,0,\$i).'<span
style="text-decoration:overline">'.\$pat.'</span>';
>         }elseif(\$o == 2){ // whole bunch of ending 0s
>                 \$r = (substr(\$b,0,\$i) != '')? \$a.'.'.substr(\$b,0,\$i):\$a;
>         }else{ //no repeat
>                 \$r = \$s;
>         }
>         return \$r;
> }
> //usage
> for(\$x = 1;\$x < 100;\$x++){
>         \$a = 11/\$x;
>         \$res = repeat(\$a);
>         echo '&nbsp;&nbsp;&nbsp;returned: '.\$res.'<br>';
> }
>
> The  check_to_end() function could probably be replaced with a regex but
those
> go in the same basket as vi with my old brain :)
>
>  Regards Tom
>
>
> --
> PHP General Mailing List (http://www.php.net/)
> To unsubscribe, visit: http://www.php.net/unsub.php
>
>

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

```