精度小数点

时间:2021-01-21 13:31:05

标签: odoo odoo-8

你好 我在 Windows 7 上使用 odoo V8 我想在打印状态上添加小数精度,例如 20000.0 到 20,000.00。 我尝试了一切,但没有成功 附上我的代码:

 ## -*- coding: utf-8 -*-

import time
from openerp.report import report_sxw
from openerp.osv import osv
from openerp import pooler
import locale

class etat104(report_sxw.rml_parse):
   def __init__(self, cr, uid, name, context=None):
        super(etat104, self).__init__(cr, uid, name, context=context)
        self.localcontext.update({
            'time': time,
            '_get_etat': self._get_etat,
            '_get_year': self._get_year,
            '_cpt': self._cpt
        })

   def _cpt(self, ss):
     locale.setlocale(locale.LC_ALL, 'fr_FR.UTF-8')
     if ss < 0.0 :
       cpt = (locale.format('%.2f', ss, True)) 
       cpt = '(' + cpt + ')'
     else:
       cpt = (locale.format('%.2f', ss, True)) 
     return cpt

   def _get_year(self,form):
        return self.pool.get('account.fiscalyear').browse(self.cr, self.uid, form).name

   def _get_etat(self,form):
        nbr = 0 
        fiscalyear = self.pool.get('account.fiscalyear').browse(self.cr, self.uid, form['fiscalyear_id'])
        period_ids=self.pool.get('account.period').search(self.cr, self.uid, [('fiscalyear_id', '=', form['fiscalyear_id'])])

        if period_ids:
            self.cr.execute("SELECT MIN(date_start) AS date_start, MAX(date_stop) AS date_stop FROM account_period WHERE id = ANY(%s)", (period_ids,))
            dates = self.cr.dictfetchall()
        else:
            dates = False
        if dates:
            if form['tri']==False :
              query = "SELECT ai.partner_id as partner, SUM(aml.credit-aml.debit) as ht   FROM account_invoice ai, account_move am,account_move_line aml, account_account aa where ai.state IN ('open','paid') "\
                "AND ai.date_invoice >= '%s' AND ai.date_invoice <= '%s' AND ai.move_id=aml.move_id "\
                "AND ai.move_id=am.id AND aml.account_id=aa.id AND aa.code like '%s' AND aa.code not like '%s' "\
                "AND ai.type like '%s' GROUP BY partner" % (dates[0]['date_start'], dates[0]['date_stop'],'70%','706%','out_%')
            else:
              query = "SELECT ai.partner_id as partner,p.name as nom, SUM(aml.credit-aml.debit) as ht   FROM account_invoice ai, account_move am,account_move_line aml, account_account aa, res_partner p where ai.state IN ('open','paid') "\
                "AND ai.date_invoice >= '%s' AND ai.date_invoice <= '%s' AND ai.move_id=aml.move_id AND p.id=ai.partner_id "\
                "AND ai.move_id=am.id AND aml.account_id=aa.id AND aa.code like '%s' AND aa.code not like '%s' "\
                "AND ai.type like '%s' GROUP BY partner,nom ORDER BY nom" % (dates[0]['date_start'], dates[0]['date_stop'],'70%','706%','out_%')
            
            res=[]
            self.cr.execute(query)
            datas = self.cr.dictfetchall()
            obj_partner=self.pool.get('res.partner')
            ref = ''
            tht = ttax = 0.0
            for dd in datas:
              if dd['ht']==0.0:
                continue
              query="SELECT ai.partner_id as partner, SUM(aml.credit-aml.debit) as tax   FROM account_invoice ai, account_move am,account_move_line aml, account_account aa where ai.state IN ('open','paid') "\
                "AND ai.date_invoice >= '%s' AND ai.date_invoice <= '%s' and ai.move_id=aml.move_id "\
                "and ai.move_id=am.id and aml.account_id=aa.id and aa.code = '445700' "\
                "AND ai.type like '%s' AND ai.partner_id= '%s'  GROUP BY partner"  % (dates[0]['date_start'], dates[0]['date_stop'],'out_%',dd['partner'])
              # raise Warning(query)
              self.cr.execute(query)
              datas2=self.cr.dictfetchall()
              tax=0.0
              # raise Warning(query)
              for i in datas2:
                tax=i['tax']
                # raise Warning(query)
              ttax+=tax
              partner = obj_partner.read(self.cr, self.uid, dd['partner'], [])
              ref = partner['name']
              if form['reference'] == True:
                 if partner['ref'] :
                    ref= '[' + partner['ref'] + '] ' + partner['name']
                 else:    
                    ref = partner['name']
              p1=partner['street'] and partner['street'] or ''
              p2=partner['city'] and partner['city'] or ''
              rue = p1 +' '+ p2
              tht += dd['ht']
              nbr += 1
              dicts={
                    'nbr': nbr,
                    'art' : partner['ai'],
                    'rc'  : partner['rc'],
                    'nif' : partner['nif'],                    
                    'name': ref[0:20],
                    'rue' : rue[0:27],
                    'ht'  : dd['ht'],
                    'tax' : tax,
                    'tht': tht,
                    'ttax': ttax
                     }
              res.append(dicts)

                   
            return res
   ###############################################################
 
report_sxw.report_sxw('report.l10n.dz.Etat-104', 'account.move.line', 'addons/l10n_dz_report/report/rmls/etat104.rml', parser=etat104, header=False)


# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

请帮忙

1 个答案:

答案 0 :(得分:0)

您可以使用 formatLang

示例:

RML:

formatLang(amount, digits=2, grouping=True)

解析器:

rml_parser = report_sxw.rml_parse(cr, uid, report_name, context=context)
rml_parser.formatLang(amount, dp='Account', currency_obj=currency)

在报表解析器中,您可以简单地使用:

self.formatLang(tht)  

编辑:

您可以在表达式中添加一个条件,以在值等于零时显示一个空字符串。

[[ k.debit and formatLang(k.debit, digits=2, grouping=True) or '' ]]

您可以在 OCA account_financial_report 模块中找到更多示例。

相关问题