Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Newbie: How to format a number to always show two decimals?

Reply
Thread Tools

Newbie: How to format a number to always show two decimals?

 
 
i.v.r.
Guest
Posts: n/a
 
      10-31-2005
Hi,

This seems like a simple task, yet I've been unable to accomplish it.
Somewhere I read you could do:

num.round(2).to_s("F")

But that is not working, as the round method doesn't accept any parameters.

Could someone help me figure this out?

Thanks!

Ivan V.



 
Reply With Quote
 
 
 
 
James Edward Gray II
Guest
Posts: n/a
 
      10-31-2005
On Oct 31, 2005, at 4:47 PM, i.v.r. wrote:

> Hi,
>
> This seems like a simple task, yet I've been unable to accomplish
> it. Somewhere I read you could do:
>
> num.round(2).to_s("F")
>
> But that is not working, as the round method doesn't accept any
> parameters.
>
> Could someone help me figure this out?


>> sprintf("%.2f", 1.012345)

=> "1.01"
>> # ... or ...

?> "%.2f" % 1.012345
=> "1.01"

Hope that helps.

James Edward Gray II


 
Reply With Quote
 
 
 
 
i.v.r.
Guest
Posts: n/a
 
      10-31-2005
James Edward Gray II wrote:
> On Oct 31, 2005, at 4:47 PM, i.v.r. wrote:
>
>> Hi,
>>
>> This seems like a simple task, yet I've been unable to accomplish it.
>> Somewhere I read you could do:
>>
>> num.round(2).to_s("F")
>>
>> But that is not working, as the round method doesn't accept any
>> parameters.
>>
>> Could someone help me figure this out?

>
> >> sprintf("%.2f", 1.012345)

> => "1.01"
> >> # ... or ...

> ?> "%.2f" % 1.012345
> => "1.01"
>
> Hope that helps.
>
> James Edward Gray II
>
>

That was fast! Thanks a lot.



 
Reply With Quote
 
Harold Hausman
Guest
Posts: n/a
 
      11-01-2005
------=_Part_9875_4065111.1130804492474
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Alternatively there's this code from Phrogz's library (
http://phrogz.net/rubylibs) which to me is more rubyish than sprintf.
Everytime you use sprintf, God kills a kitten.

-Harold

#Code Follows:

class Numeric
# Rounds to the specified number of decimal places, returning a string
value.
#
# (1.234).round_to(2) =3D> '1.23'
# (-1.234).round_to(2) =3D> '-1.23'
# (-0.007).round_to(2) =3D> '-0.01'
# (-0.007).round_to(1) =3D> '0.0'
def round_to(decimals)
if self<0 then
s=3D'-';
x=3D-self;
else
s=3D'';
x=3Dself;
end
if x>=3D1.0e15 then
m=3Dx.to_s;
else
m=3D(x*10**decimals).round.to_s
if (decimals!=3D0) then
k=3Dm.length;
if k<=3Ddecimals then
z=3D'000000000000000'[0..(decimals-k)]
m=3Dz+m;
k=3Ddecimals+1;
end
m.insert(k-decimals,'.');
end
end
s=3D'' if (/^0\.0*$/=3D~m);
s+m;
end
end


On 10/31/05, i.v.r. <> wrote:
>
> James Edward Gray II wrote:
> > On Oct 31, 2005, at 4:47 PM, i.v.r. wrote:
> >
> >> Hi,
> >>
> >> This seems like a simple task, yet I've been unable to accomplish it.
> >> Somewhere I read you could do:
> >>
> >> num.round(2).to_s("F")
> >>
> >> But that is not working, as the round method doesn't accept any
> >> parameters.
> >>
> >> Could someone help me figure this out?

> >
> > >> sprintf("%.2f", 1.012345)

> > =3D> "1.01"
> > >> # ... or ...

> > ?> "%.2f" % 1.012345
> > =3D> "1.01"
> >
> > Hope that helps.
> >
> > James Edward Gray II
> >
> >

> That was fast! Thanks a lot.
>
>
>


------=_Part_9875_4065111.1130804492474--


 
Reply With Quote
 
David A. Black
Guest
Posts: n/a
 
      11-01-2005
Hi --

On Tue, 1 Nov 2005, Harold Hausman wrote:

> Alternatively there's this code from Phrogz's library (
> http://phrogz.net/rubylibs) which to me is more rubyish than sprintf.
> Everytime you use sprintf, God kills a kitten.
>
> -Harold
>
> #Code Follows:
>
> class Numeric
> # Rounds to the specified number of decimal places, returning a string
> value.
> #
> # (1.234).round_to(2) => '1.23'
> # (-1.234).round_to(2) => '-1.23'
> # (-0.007).round_to(2) => '-0.01'
> # (-0.007).round_to(1) => '0.0'
> def round_to(decimals)
> if self<0 then
> s='-';
> x=-self;
> else
> s='';
> x=self;
> end
> if x>=1.0e15 then
> m=x.to_s;
> else
> m=(x*10**decimals).round.to_s
> if (decimals!=0) then
> k=m.length;
> if k<=decimals then
> z='000000000000000'[0..(decimals-k)]
> m=z+m;
> k=decimals+1;
> end
> m.insert(k-decimals,'.');
> end
> end
> s='' if (/^0\.0*$/=~m);
> s+m;
> end
> end


Aside to Phrogz: is that left over from a game of code golf??


David

--
David A. Black



 
Reply With Quote
 
James Edward Gray II
Guest
Posts: n/a
 
      11-01-2005
On Oct 31, 2005, at 6:21 PM, Harold Hausman wrote:

> Alternatively there's this code from Phrogz's library (
> http://phrogz.net/rubylibs) which to me is more rubyish than sprintf.


Hmm, it's certainly not Ruby length...

James Edward Gray II



 
Reply With Quote
 
Ara.T.Howard
Guest
Posts: n/a
 
      11-01-2005
On Tue, 1 Nov 2005, Harold Hausman wrote:

> Alternatively there's this code from Phrogz's library (
> http://phrogz.net/rubylibs) which to me is more rubyish than sprintf.
> Everytime you use sprintf, God kills a kitten.


that quote is absolutely beautiful - though i __much__ prefer printf to cout


>
> -Harold
>
> #Code Follows:
>
> class Numeric
> # Rounds to the specified number of decimal places, returning a string
> value.
> #
> # (1.234).round_to(2) => '1.23'
> # (-1.234).round_to(2) => '-1.23'
> # (-0.007).round_to(2) => '-0.01'
> # (-0.007).round_to(1) => '0.0'
> def round_to(decimals)
> if self<0 then
> s='-';
> x=-self;
> else
> s='';
> x=self;
> end
> if x>=1.0e15 then
> m=x.to_s;
> else
> m=(x*10**decimals).round.to_s
> if (decimals!=0) then
> k=m.length;
> if k<=decimals then
> z='000000000000000'[0..(decimals-k)]
> m=z+m;
> k=decimals+1;
> end
> m.insert(k-decimals,'.');
> end
> end
> s='' if (/^0\.0*$/=~m);
> s+m;
> end
> end
>
>
> On 10/31/05, i.v.r. <> wrote:
>>
>> James Edward Gray II wrote:
>>> On Oct 31, 2005, at 4:47 PM, i.v.r. wrote:
>>>
>>>> Hi,
>>>>
>>>> This seems like a simple task, yet I've been unable to accomplish it.
>>>> Somewhere I read you could do:
>>>>
>>>> num.round(2).to_s("F")
>>>>
>>>> But that is not working, as the round method doesn't accept any
>>>> parameters.
>>>>
>>>> Could someone help me figure this out?
>>>
>>>>> sprintf("%.2f", 1.012345)
>>> => "1.01"
>>>>> # ... or ...
>>> ?> "%.2f" % 1.012345
>>> => "1.01"
>>>
>>> Hope that helps.
>>>
>>> James Edward Gray II
>>>
>>>

>> That was fast! Thanks a lot.
>>
>>
>>

>


-a
--
================================================== =============================
| email :: ara [dot] t [dot] howard [at] noaa [dot] gov
| phone :: 303.497.6469
| anything that contradicts experience and logic should be abandoned.
| -- h.h. the 14th dalai lama
================================================== =============================



 
Reply With Quote
 
Gavin Kistner
Guest
Posts: n/a
 
      11-01-2005
--Apple-Mail-4-77238386
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain;
charset=MACINTOSH;
delsp=yes;
format=flowed

On Oct 31, 2005, at 5:41 PM, David A. Black wrote:
> Aside to Phrogz: is that left over from a game of code golf??


LOL. No, before I grokked sprintf, I needed the round_to =20
functionality. That's a port of the Number.toFixed algorithm from =20
section 15.7.4.5 of the ECMAScript (ECMA-262) specs:

15.7.4.5 Number.prototype.toFixed (fractionDigits)
Return a string containing the number represented in fixed-point =20
notation with fractionDigits digits after the decimal point. If =20
fractionDigits is undefined, 0 is assumed. Specifically, perform the =20
following steps:

1. Let =C4 be ToInteger(fractionDigits). (If fractionDigits is =20
undefined, this step produces the value 0).
2. If =C4 < 0 or =C4 > 20, t hrow a RangeError exception.
3. Let x be this number value.
4. If x is NaN, return the string "NaN".
5. Let s be t he empty string.
6. I f x =B3 0, go to step 9.
7. Let s be "-".
8. Let x =3D =D0x.
9. I f x =B3 10^21, let m =3D ToString(x) and go to step 20.
10. Let n be an integer for which the exact mathematical value of n =D6 =20=

10^=C4 =D0 x is as close to zero as possible. If there are two such n, =20=

pick t he larger n.
11. I f n =3D 0, let m be the string "0". Otherwise, let m be the =20
string consisting of the digits of the decimal representation of n =20
(in order, with no leading zeroes).
12. If =C4 =3D 0, go to step 20.
13. Let k be the number of characters in m.
14. If k > =C4, go to step 18.
15. Let z be the string consisting of =C4 +1=D0k occurrences of the =20
character =D40=D5.
16. Let m be the concatenation of strings z and m.
17. Let k =3D =C4 + 1.
18. Let a be the first k=D0=C4 characters of m, and let b be the =20
remaining =C4 characters of m.
19. Let m be the concatenation of the three strings a, ".", and b.
20. Return the concatenation of the strings s and m.




--Apple-Mail-4-77238386--


 
Reply With Quote
 
David A. Black
Guest
Posts: n/a
 
      11-01-2005
Hi --

On Tue, 1 Nov 2005, Gavin Kistner wrote:

> On Oct 31, 2005, at 5:41 PM, David A. Black wrote:
>> Aside to Phrogz: is that left over from a game of code golf??

>
> LOL. No, before I grokked sprintf, I needed the round_to functionality.
> That's a port of the Number.toFixed algorithm from section 15.7.4.5 of the
> ECMAScript (ECMA-262) specs:


Interesting pedigree.

It was the semi-colons and the vacuum-packed syntax that made me think
it might be a multi-line split-out of a former golf entry


David

--
David A. Black



 
Reply With Quote
 
Gavin Kistner
Guest
Posts: n/a
 
      11-01-2005
On Nov 1, 2005, at 7:49 AM, David A. Black wrote:
> On Tue, 1 Nov 2005, Gavin Kistner wrote:
>> On Oct 31, 2005, at 5:41 PM, David A. Black wrote:
>>> Aside to Phrogz: is that left over from a game of code golf??

>> LOL. No, before I grokked sprintf, I needed the round_to
>> functionality. That's a port of the Number.toFixed algorithm from
>> section 15.7.4.5 of the ECMAScript (ECMA-262) specs:

> Interesting pedigree.
>
> It was the semi-colons and the vacuum-packed syntax that made me think
> it might be a multi-line split-out of a former golf entry


Ah, no. Upon reflection, those are because the ruby code is actually
a port of my JavaScript version of that algorithm. Microsoft's own
implementation of Number.toFixed did not (at some point, perhaps
currently) conform to that algorithm (and other JS engines did not at
some point support that method, despite it being part of the spec) so
I wrote my own JS-only port to patch bad engines as needed. When it
came time to for the Ruby version, a bit of syntax conversion seems
to be all I did.

At the point in my life when I wrote the JS version, I was very into
very terse formatting. Whitespace seemed to be at a premium during
that dark period.


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: How include a large array? Edward A. Falk C Programming 1 04-04-2013 08:07 PM
Re: Using %x to format number to hex and number of digits Chris Rebert Python 1 11-05-2010 07:05 PM
binary number format ? format character %b or similar. Ken Starks Python 4 06-23-2008 08:59 AM
converting exponential format number to decimal format number Fei Liu Perl Misc 21 12-16-2006 01:49 AM
XSLT error with number and format-number functions silellak@gmail.com XML 1 09-18-2006 11:08 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57