Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > I need a neat way to print nothing or a number

Reply
Thread Tools

I need a neat way to print nothing or a number

 
 
cl@isbd.net
Guest
Posts: n/a
 
      03-26-2013
What's a neat way to print columns of numbers with blanks where a number
is zero or None?

E.g. I want to output something like:-

Credit Debit Description
100.00 Initial balance
123.45 Payment for cabbages
202.00 Telephone bill


For each line I have either the credit or the debit amount and the other
is 0 or None. However you can't get number formatting (old or new) to
output a blank for 0 and it barfs on None.

--
Chris Green
 
Reply With Quote
 
 
 
 
Chris Angelico
Guest
Posts: n/a
 
      03-26-2013
On Wed, Mar 27, 2013 at 2:50 AM, <(E-Mail Removed)> wrote:
> What's a neat way to print columns of numbers with blanks where a number
> is zero or None?
>
> E.g. I want to output something like:-
>
> Credit Debit Description
> 100.00 Initial balance
> 123.45 Payment for cabbages
> 202.00 Telephone bill
>
>
> For each line I have either the credit or the debit amount and the other
> is 0 or None. However you can't get number formatting (old or new) to
> output a blank for 0 and it barfs on None.


Try printing out this expression:

"%.2f"%value if value else ''

Without the rest of your code I can't tell you how to plug that in,
but a ternary expression is a good fit here.

ChrisA
 
Reply With Quote
 
 
 
 
John Gordon
Guest
Posts: n/a
 
      03-26-2013
In <(E-Mail Removed)> http://www.velocityreviews.com/forums/(E-Mail Removed) writes:

> What's a neat way to print columns of numbers with blanks where a number
> is zero or None?


print number or ' '

--
John Gordon A is for Amy, who fell down the stairs
(E-Mail Removed) B is for Basil, assaulted by bears
-- Edward Gorey, "The Gashlycrumb Tinies"

 
Reply With Quote
 
Wolfgang Maier
Guest
Posts: n/a
 
      03-26-2013
Chris Angelico <rosuav <at> gmail.com> writes:

>
> Try printing out this expression:
>
> "%.2f"%value if value else ''
>
> Without the rest of your code I can't tell you how to plug that in,
> but a ternary expression is a good fit here.
>
> ChrisA
>


Unfortunately, that's not working, but gives a TypeError: a float is required
when the first value evaluates to False.
Apparently it's not that easy to combine number formatting with logical
operators - the same happens with my idea ('{:.2f}').format(value or '').

Wolfgang




 
Reply With Quote
 
Ethan Furman
Guest
Posts: n/a
 
      03-26-2013
On 03/26/2013 10:06 AM, Wolfgang Maier wrote:
> Chris Angelico <rosuav <at> gmail.com> writes:
>
>>
>> Try printing out this expression:
>>
>> "%.2f"%value if value else ''
>>
>> Without the rest of your code I can't tell you how to plug that in,
>> but a ternary expression is a good fit here.
>>
>> ChrisA
>>

>
> Unfortunately, that's not working, but gives a TypeError: a float is required
> when the first value evaluates to False.
> Apparently it's not that easy to combine number formatting with logical
> operators - the same happens with my idea ('{:.2f}').format(value or '').


Use parens then:

("%.2f" % value) if value else ''

--
~Ethan~
 
Reply With Quote
 
Peter Otten
Guest
Posts: n/a
 
      03-26-2013
Wolfgang Maier wrote:

> Chris Angelico <rosuav <at> gmail.com> writes:
>
>>
>> Try printing out this expression:
>>
>> "%.2f"%value if value else ''
>>
>> Without the rest of your code I can't tell you how to plug that in,
>> but a ternary expression is a good fit here.
>>
>> ChrisA
>>

>
> Unfortunately, that's not working, but gives a TypeError: a float is
> required when the first value evaluates to False.
> Apparently it's not that easy to combine number formatting with logical
> operators - the same happens with my idea ('{:.2f}').format(value or '').


Here's a round-about way:

class Prepare:
def __init__(self, value):
self.value = value
def __format__(self, spec):
if self.value is None or self.value == 0:
return format(0.0, spec).replace(".", " ").replace("0", " ")
elif isinstance(self.value, str):
return self.value.rjust(len(format(0.0, spec)))
return format(self.value, spec)

def prepare(row):
return map(Prepare, row)

data = [
("Credit", "Debit", "Description"),
(100, 0, "Initial balance"),
(123.45, None, "Payment for cabbages"),
(0.0, 202.0, "Telephone bill"),
]

for row in data:
print("{:10.2f} {:10.2f} {}".format(*prepare(row)))



 
Reply With Quote
 
Chris Angelico
Guest
Posts: n/a
 
      03-26-2013
On Wed, Mar 27, 2013 at 4:21 AM, Ethan Furman <(E-Mail Removed)> wrote:
> On 03/26/2013 10:06 AM, Wolfgang Maier wrote:
>>
>> Chris Angelico <rosuav <at> gmail.com> writes:
>>
>>>
>>> Try printing out this expression:
>>>
>>> "%.2f"%value if value else ''
>>>
>>> Without the rest of your code I can't tell you how to plug that in,
>>> but a ternary expression is a good fit here.
>>>
>>> ChrisA
>>>

>>
>> Unfortunately, that's not working, but gives a TypeError: a float is
>> required
>> when the first value evaluates to False.
>> Apparently it's not that easy to combine number formatting with logical
>> operators - the same happens with my idea ('{:.2f}').format(value or '').

>
>
> Use parens then:
>
> ("%.2f" % value) if value else ''


According to the operator precedence table, the parens are unnecessary there.

ChrisA
 
Reply With Quote
 
Wolfgang Maier
Guest
Posts: n/a
 
      03-27-2013
Chris Angelico <rosuav <at> gmail.com> writes:

>
> On Wed, Mar 27, 2013 at 4:06 AM, Wolfgang Maier
> <wolfgang.maier <at> biologie.uni-freiburg.de> wrote:
> > Chris Angelico <rosuav <at> gmail.com> writes:
> >
> >>
> >> Try printing out this expression:
> >>
> >> "%.2f"%value if value else ''
> >>
> >> Without the rest of your code I can't tell you how to plug that in,
> >> but a ternary expression is a good fit here.
> >>
> >> ChrisA
> >>

> >
> > Unfortunately, that's not working, but gives a TypeError: a float is required
> > when the first value evaluates to False.
> > Apparently it's not that easy to combine number formatting with logical
> > operators - the same happens with my idea ('{:.2f}').format(value or '').

>
> Really? Works for me in 3.3:
>
> >>> value=1.2
> >>> "%.2f"%value if value else ''

> '1.20'
> >>> value=0
> >>> "%.2f"%value if value else ''

> ''
> >>> value=None
> >>> "%.2f"%value if value else ''

> ''
>
> What's the full context? The way I've written the expression, it's
> guaranteed to return a string (either "%.2f"5value or the literal '',
> and yes, I'm aware that I was inconsistent with the quotes).
>
> I tried it in 2.6 and it worked there, too. Now, if you parenthesize
> the bit after the percent sign, the TypeError comes up. But that
> wasn't the intention of the code (and "value if value else
> something-else" is just "value or something-else", anyway).
>
> ChrisA
>


Hi Chris,
yes, I had put parens around your ternary operator expression after the %.
Should have read your code more carefully, but I assumed what you tried to do
was to obtain a *formatted* string in both cases. Your suggestion as it is
really just gives formatting for numbers, but returns an empty string for False
values, so it's just a partial solution to the original problem (basically
converting everything to strings ready for an additional round of formatting).
Anyway, there's a better answer by now, so never mind.
Cheers,
Wolfgang


 
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: Neat way of checking that two hash values both exist? hymie! Perl Misc 1 08-27-2012 07:34 PM
Re: Neat way of checking that two hash values both exist? Tim McDaniel Perl Misc 2 08-27-2012 07:27 PM
re module: Nothing to repeat, but no sre_constants.error: nothing torepeat ? Devin Jeanpierre Python 2 02-14-2012 01:33 PM
Neat way to get rid of [" "] in sys.argv[n:] returns korean_dave Python 0 07-24-2008 08:48 PM
Wscript.Shell run PRINT and NET PRINT returns nothing Salty Dog ASP General 4 02-28-2005 06:45 PM



Advertisments