This question has been flagged
5 Replies
6186 Views

When printing invoices and order documents, I would like to remove trailing zeros, in order to get the following results:

- Odoo quantity: 1.000 -> printed quantity: 1
- Odoo quantity: 1.500 -> printed quantity: 1.5
- Odoo quantity: 2.750 -> printed quantity: 2.75

Based on Steve Mack's answer I tried the following in my QWeb amendment of the invoice document:

<xpath expr="//span[@t-field='l.quantity']" position="replace">
<t>
<t t-set="mod_qty">
formatLang(l.quantity, digit=0)
</t>
<t t-if="mod_qty == l.quantity">
<span><t t-esc="mod_qty"/></span>
</t>
<t t-if="mod_qty != l.quantity">
<span><t t-esc="(l.quantity * 1)"/></span>
</t>
</t>
</xpath>

But the result is not as desired, instead of "1", I receive "1.0", the other examples work properly. My result is:

https://imgur.com/a/kemkwbg




Avatar
Discard

Hii,try this
you will get wot u need :)
create new field 'quantity_new' and give onchange function for quantity

@api.onchange('quantity')
def onchange_quantity_for_demo(self):
a = self.quantity
b = str(a)
x=b.split(".")
if int(x[1])>0:
self.quantity_new = b
else:
self.quantity_new = str(x[0])

thank you

Best Answer

Hi,

Please try this

<span t-esc="'%.0f'% line.qty"/>

Thanks !!!  


Aswini @ iWesabe


Avatar
Discard
Author

Thank you for your answer, but this does not work of course. You can test and check it yourself:

- Odoo quantity: 1.000 -> result in report: 1

- Odoo quantity: 2.000 -> result in report: 2, but:

- Odoo quantity: 1.500 -> result in report: 2 (instead of 1.5)

- Odoo quantity: 2.750 -> result in report: 3 (instead of 2.75)

<t>
<t t-if="round(line.quantity,0) == line.quantity">
<span t-esc="'%.0f'% line.quantity"></span>
</t>
<t t-else="">
<span t-esc="(line.quantity * 1)"></span>
</t>
</t>

Best Answer

Hello, Decimal Precision will help to set the required number of digits in the amount.

Avatar
Discard

<span><t t-esc="mod_qty" t-options='{"widget": "float", "precision": 2}'/></span>

Best Answer

Added my code in the comment to the accepted answer.  That code got me the answer that the post was asking for.

1.000 >> 1

1.100 >> 1.1

1.110 >> 1.11

1.111 >>> 1.111

Avatar
Discard
Best Answer

You could use Python to convert a `float` into a `str` and then strip it of the trailing zeros. For example:

>>> for x in (1, 2.000, 2.750): str(x)
... 
'1'
'2.0'
'2.75'

So we can define a function like this:

def parse_num(x):
x = str(x)
    integer, decimals = x.split('.') if '.' in x else (x, None)
if decimals in ('0', None):
return integer
else:
        return x

Which results in:

>>> for x in (1, 2.000, 2.750): parse_num(x)
...
'1'
'2'
'2.75'

So maybe you could try with this:

<t t-set="mod_qty">
    formatLang(l.quantity, digit=0)
</t>
<t t-if="mod_qty == l.quantity">
  <span><t t-esc="parse_num(mod_qty)"/></span>
</t>
<t t-if="mod_qty != l.quantity">
  <span><t t-esc="parse_num(l.quantity * 1)"/></span>
</t>


Avatar
Discard
Best Answer
Try this:
<t t-if="mod_qty == l.quantity">
<span><t t-esc="int(float(mod_qty))"/></span>
</t>
<t t-if="mod_qty != l.quantity">
<span><t t-esc="int(float(l.quantity * 1))"/></span>
</t>


Avatar
Discard
Author

Unfortunately, this does not work either, as it always delivers a number without any decimals (but not rounded).