10

I have the following f-string I want to print out on the condition the variable is available:

f"Percent growth: {self.percent_growth if True else 'No data yet'}"

Which results in:

Percent growth : 0.19824077757643577

So normally I'd use a type specifier for float precision like this:

f'{self.percent_growth:.2f}'

Which would result in:

0.198

But that messes with the if-statement in this case. Either it fails because:

f"Percent profit : {self.percent_profit:.2f if True else 'None yet'}"

The if statement becomes unreachable. Or in the second way:

f"Percent profit : {self.percent_profit if True else 'None yet':.2f}"

The f-string fails whenever the condition leads to the else clause.

So my question is, how can I apply the float precision within the f-string when the f-string can result in two types?

NoSplitSherlock
  • 605
  • 4
  • 19

3 Answers3

11

You could use another f-string for your first condition:

f"Percent profit : {f'{self.percent_profit:.2f}' if True else 'None yet'}"

Admittedly not ideal, but it does the job.

Nikolas Stevenson-Molnar
  • 4,235
  • 1
  • 22
  • 31
  • 2
    Another way is using `str.format` but I don't think it's any different. `f"Percent profit : {'{:.2f}'.format(self.percent_format) if True else 'None yet'}"` This is as simple as it gets if OP insists putting the condition within the f string itself. – r.ook Mar 01 '19 at 18:09
  • @Idlehands Isn't it strange though that I can format strings and use conditionals, but not both at the same time? – NoSplitSherlock Mar 01 '19 at 18:24
  • 1
    @NoSplitSherlock If both outcomes of the the conditional were the same, you could. I think the tricky part of your example is that your conditional will yield either a float _or_ a string. – Nikolas Stevenson-Molnar Mar 01 '19 at 18:26
  • 1
    @PatrickArtner see the OP’s question and code sample. The `if True` is a stand in for any conditional. – Nikolas Stevenson-Molnar Mar 01 '19 at 18:43
2

I think the f string within f string answer is as simple as it gets, but if you want a little bit more readability, consider moving the condition outside the f string:

value = f'{self.percent_profit:.2f}' if True else 'No data yet'
print(f"Percent profit : {value}")
r.ook
  • 13,466
  • 2
  • 22
  • 39
2

You can use a ternary for the formatter as well - no need to stack 2 f-strings like Nikolas answer does:

for pg in (2.562345678, 0.9, None):   # 0.0 is also Falsy - careful ;o)
    print(f"Percent Growth: {pg if pg else 'No data yet':{'.05f' if pg else ''}}")
    # you need to put '.05f' into a string for this to work and not complain

Output:

Percent growth: 2.56235
Percent growth: 0.90000
Percent growth: No data yet
Patrick Artner
  • 50,409
  • 9
  • 43
  • 69