Нужна помощь в округлении результатов Mysql, возвращаемых функцией python

#mysql #python-3.x

#mysql #python-3.x

Вопрос:

Я относительно новичок в python, и я работаю над созданием программы в свое удовольствие, чтобы автоматически генерировать лист продаж. Он имеет несколько функций, которые извлекают необходимые данные из базы данных, а также reportlab и несколько других инструментов для размещения результатов в сгенерированном pdf. Я пытаюсь округлить результаты, поступающие с сервера Mysql. Однако я попал в точку, где я застрял, и все способы, которыми я пытался округлить результаты, выдают код ошибки и не работают. Мне нужно посмотреть несколько примеров, чтобы я мог понять, как это будет работать, и любые соответствующие отзывы, которые помогут мне учиться.

Я пытался использовать функцию mysql round для округления результатов, но это не удалось. Я также попытался округлить результаты как часть функции, которая сама генерирует стоимость единицы. Однако это также не удалось.

Большой объем кода был удален из-за дыры в безопасности, которую он мог бы создать. Предоставленный код должен показать, что я сделал до сих пор. Строка результата печати предназначена для проверки того, что код работает во время разработки. Он не выдает никаких ошибочных результатов и будет удален на последнем этапе проекта.

  def upcpsfunc(self, upc):
    mycursor = self.mydb.cursor()
    command = "Select Packsize from name"" where UPC = %(Upc)s"
    mycursor.execute(command, {'Upc': upc})
    result = mycursor.fetchone()
    print(result[0])
    return result[0]

 def unitcost(self,upc):
    #function to generate unit cost
    mycursor = self.mydb.cursor()
    command = "Select Concat((Cost - Allow)/Packsize) as total from name 
    where UPC = %(Upc)s"
    mycursor.execute(command, {'Upc': upc})
    result = mycursor.fetchone()
    print (result[0])
    return result[0]
 

Что касается ожидаемых результатов, я бы предпочел, чтобы команда mysql округляла результаты, прежде чем отправлять их в Reportlab для размещения. Пока результаты составляют 4 или 5 цифр, что не идеально. Я хочу, чтобы результаты имели два знака после запятой, так как это были бы деньги. Желаемый результат — 7,50 вместо 7,5025

Ответ №1:

round Функция может использоваться для округления чисел:

 >>> round(7.5025, 2)
7.5
 

Чтобы получить дополнительный 0 в конце, вы можете использовать следующий код:

 >>> def round_money(n):
    s = str(round(n, 2))
    if len(s) == 1: # exact dollar
        return s   ".00"
    elif len(s) == 3: # exact x10 cents
        return s   "0"
    return s

>>> round_money(6)
'6.00'
>>> round_money(7.5025)
'7.50'
 

Обратите внимание, что эта функция возвращает строку, потому 7.50 что не может быть представлена целым числом в python.

Ответ №2:

В качестве альтернативы уже предоставленному способу вы можете сделать то же самое с форматированием строки (хотя десятичные дроби будут усечены, так что вы все равно можете округлить заранее):

 >>> '{:,.2f}'.format(0)
'0.00'
>>> '{:,.2f}'.format(15342.62412)
'15,342.62'