how to improve this simple block of code

P

py

Say I have...
x = "132.00"

but I'd like to display it to be "132" ...dropping the trailing
zeros...I currently try this

if x.endswith("0"):
x = x[:len(x)-1]
if x.endswith("0"):
x = x[:len(x)-1]
if x.endswith("."):
x = x[:len(x)-1]

I do it like this because if
x = "132.15" ...i dont want to modify it. But if
x = "132.60" ...I want it to become "132.6"

is there a better way to do this? It seems a bit ugly to me.

T.I.A
(thanks in advance)
 
J

Juho Schultz

py said:
Say I have...
x = "132.00"

but I'd like to display it to be "132" ...dropping the trailing
zeros...I currently try this

if x.endswith("0"):
x = x[:len(x)-1]
if x.endswith("0"):
x = x[:len(x)-1]
if x.endswith("."):
x = x[:len(x)-1]

I do it like this because if
x = "132.15" ...i dont want to modify it. But if
x = "132.60" ...I want it to become "132.6"

is there a better way to do this? It seems a bit ugly to me.

T.I.A
(thanks in advance)

x = x.rstrip('0') # removes trailing zeros
x = x.rstrip('.') # removes trailing dot(s)
 
R

Roy Smith

"py said:
Say I have...
x = "132.00"

but I'd like to display it to be "132" ...dropping the trailing
zeros...I currently try this


This sounds to me like a job for regular expressions. Something like:

re.sub (r'\.?0*$', '', x)

will do what you want. Check out the re module in the docs for more
details.
 
M

Matt Hammond

Say I have...
x = "132.00"

but I'd like to display it to be "132" ...dropping the trailing
zeros...

How about:

if "." in x:
x, frac = x.split(".")
frac = frac.rstrip("0")
if frac:
x = x + "." + frac


Copes if x = "132" too. If there'll always be a decimal point, then you
can leave off the initial "if".



Matt
--

| Matt Hammond
| R&D Engineer, BBC Research & Development, Tadworth, Surrey, UK.
| http://kamaelia.sf.net/
| http://www.bbc.co.uk/rd/
 
M

Mike Meyer

py said:
Say I have...
x = "132.00"
but I'd like to display it to be "132" ...dropping the trailing
zeros...I currently try this

The two-strip solution is cleaner, but:
if x.endswith("0"):
x = x[:len(x)-1]
x = x[:-1]
or
del x[-1]

both improve that one statement.

<mike
 
P

Peter Otten

Mike said:
py said:
Say I have...
x = "132.00"
but I'd like to display it to be "132" ...dropping the trailing
zeros...I currently try this

The two-strip solution is cleaner, but:
if x.endswith("0"):
x = x[:len(x)-1]
x = x[:-1]
or
del x[-1]

both improve that one statement.
del "it's tempting not to try"[-1]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: object doesn't support item deletion

Just-pointing-out-what-does-not-work-ly yours

Peter
 
G

Gary Duzan

py said:
x = "132.15" ...i dont want to modify it. But if
x = "132.60" ...I want it to become "132.6"

is there a better way to do this? It seems a bit ugly to me.

The following works as long as you don't mind losing leading zeros
as well:

x = x.strip('0')

Gary Duzan
Motorola CHS
 
M

Matt Hammond

How about:
if "." in x:
x, frac = x.split(".")
frac = frac.rstrip("0")
if frac:
x = x + "." + frac

Or simpler still:

if "." in x:
x = x.rstrip("0")
x = x.rstrip(".")


More concise, but slightly less readable IMO:

if "." in x:
x = x.rstrip("0").rstrip(".")

--

| Matt Hammond
| R&D Engineer, BBC Research & Development, Tadworth, Surrey, UK.
| http://kamaelia.sf.net/
| http://www.bbc.co.uk/rd/
 
P

Peter Hansen

py said:
knew there had to be a way, thanks.

But that's not it. :)

This is a wonderful opportunity for you to learn about unit testing, and
begin the long process of developing good testing habits. Of all the
ideas posted, I believe only Mark Hammond's would correctly pass the
basic obvious test cases, and I don't think anyone (without actually
having checked with tests) should be saying even his is clearly correct.

import unittest
from yourmodule import stripZeros # or whatever you have

class Tests(unittest.TestCase):
def test01(self):
'check zero-stripper'
for input, expected in [
('', ''),
('0', '0'),
('0.0', '0'),
('0.', '0'),
('000.', '000'),
('10', '10'),
('10.0', '10'),
('foo', 'foo'),
('foo.', 'foo'), # ??
('132.15', '132.15'),
('132.60', '132.6'),
('132.00', '132'),
('132.00000', '132'),
('132.000001', '132.000001'),
# add others to taste
]:
self.assertEquals(expected, stripZeros(input))

unittest.main()


Change the above test cases to match what you really want if they're not
correct, then run the script and make sure everything passes.

-Peter
 
P

Peter Otten

Peter said:
Of all the ideas posted, I believe only Mark Hammond's would correctly
pass the basic obvious test cases

Too bad he didn't post at all :)

Peter
 
P

Peter Hansen

Peter said:
Too bad he didn't post at all :)

D'oh! There was a typo in my message above. Naturally, I meant to
write "M. Hammond" instead of "Mark Hammond". ;-)

Sorry Matt!

-Peter
 
X

Xavier Morel

Forget about the previous mail, i just saw you were converting the
string to float beforehand, in which case he would more than likely run
into the good ol' float imprecision issue sooner than later.

Not to mention that %g formats to scientific notation (e.g. exponential
format with the exponent always being a multiple of 3), he'd probably
use "%f".
 
S

Steven D'Aprano

Say I have...
x = "132.00"

but I'd like to display it to be "132" ...dropping the trailing
zeros...I currently try this

Mucking about with the string is one solution. Here is another:

print int(float(x))

I do it like this because if
x = "132.15" ...i dont want to modify it. But if
x = "132.60" ...I want it to become "132.6"

Then you want:

x = float("123.60") # full precision floating point value
r = round(x, 1) # rounded to one decimal place
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,575
Members
45,053
Latest member
billing-software

Latest Threads

Top