Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   I need a neat way to print nothing or a number (http://www.velocityreviews.com/forums/t959100-i-need-a-neat-way-to-print-nothing-or-a-number.html)

cl@isbd.net 03-26-2013 03:50 PM

I need a neat way to print nothing or a number
 
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

Chris Angelico 03-26-2013 04:08 PM

Re: I need a neat way to print nothing or a number
 
On Wed, Mar 27, 2013 at 2:50 AM, <cl@isbd.net> 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

John Gordon 03-26-2013 04:29 PM

Re: I need a neat way to print nothing or a number
 
In <jms82a-6sl.ln1@chris.zbmc.eu> cl@isbd.net 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
gordon@panix.com B is for Basil, assaulted by bears
-- Edward Gorey, "The Gashlycrumb Tinies"


Wolfgang Maier 03-26-2013 05:06 PM

Re: I need a neat way to print nothing or a number
 
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





Ethan Furman 03-26-2013 05:21 PM

Re: I need a neat way to print nothing or a number
 
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~

Peter Otten 03-26-2013 05:22 PM

Re: I need a neat way to print nothing or a number
 
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)))




Chris Angelico 03-26-2013 06:48 PM

Re: I need a neat way to print nothing or a number
 
On Wed, Mar 27, 2013 at 4:21 AM, Ethan Furman <ethan@stoneleaf.us> 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

Wolfgang Maier 03-27-2013 08:23 AM

Re: I need a neat way to print nothing or a number
 
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




All times are GMT. The time now is 10:01 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.