Как объединить строки округленных чисел python? - PullRequest
2 голосов
/ 06 апреля 2020

У меня возникают проблемы с вычислением ошибки в том, как я объединяю строку в python.

Цель состоит в том, чтобы отформатировать числа в строку, которую я могу напечатать с одинаковой длиной.

Я написал следующий код:

def numPrint(number,roundplace):
    num = round(number, roundplace)
    if num > 0:
        output = ('+' + str(num))
    elif num < 0:
        output = (str(num))
    else:
        output = (' 0.' + '0' * roundplace)    

    if len(output) < (3 + roundplace):
        output2 = (output + '0')
    else:
        output2 = output

    return output2

print(numPrint(0.001, 3))
print(numPrint(0, 3))
print(numPrint(-0.0019, 3))
print(numPrint(-0.01, 3))
print(numPrint(0.1, 3))

Я ожидаю, что он напечатает:

+0.001
 0.000
-0.002
-0.010
+0.100

однако я получаю

+0.001
 0.000
-0.002
-0.010
+0.10

Как добавить «0» к последнему, чтобы оно заработало?

Ответы [ 7 ]

2 голосов
/ 06 апреля 2020

Вы просто забыли умножить нули на output2:

if len(output) < (3 + roundplace):
    output2 = (output + ('0'*(3 + roundplace - len(output))))
else:
    output2 = output

Или, если вы не возражаете, используя встроенную функцию:

output2 = output.ljust(3 + roundplace, '0')
1 голос
/ 06 апреля 2020

Попробуйте использовать строковый метод .format(), это действительно полезно и удобно.

def numPrint(number,roundPlace):
   return "{{:+.{}f}}".format(roundPlace).format(number)
1 голос
/ 06 апреля 2020

Вы можете использовать форматирование строки, если вы просто хотите отобразить числа.

def format_number(number, minimum_digits=1, decimal_places=2):
    format_string = '{{: {}.{}f}}'.format(minimum_digits, decimal_places)
    result = format_string.format(number)
    if number:
        result = result.replace(' ', '+', 1)  # Technically you can use '+' above but your desired output requires zero to have no sign
    return result

print(format_number(0.001, minimum_digits=1, decimal_places=3))
print(format_number(0, minimum_digits=1, decimal_places=3))
print(format_number(-0.0019, minimum_digits=1, decimal_places=3))
print(format_number(-0.01, minimum_digits=1, decimal_places=3))
print(format_number(0.1, minimum_digits=1, decimal_places=3))
+0.001
 0.000
-0.002
-0.010
+0.100
1 голос
/ 06 апреля 2020

Попробуйте это:


def num_print(number, roundplace):
    sign = '+' if number != 0 else ' '
    output = '{num:{sign}.{rp}f}'.format(num=number, sign=sign, rp=roundplace) # python3
#     output = f'{number:{sign}.{roundplace}f}' # python 3.6 +
    return output

+0.001
 0.000
-0.002
-0.010
+0.100
0 голосов
/ 06 апреля 2020

Для Python 3.6+ вы можете использовать f-строку :

def num_print(number, round_place):
    return f"{number:{'+' if number else ' '}.{round_place}f}"

(я намеренно изменил названия вашей функции и ее второй параметр от numPrint и roundPlace до num_print и round_place для согласования с PEP 8 - Руководство по стилю: имена функций и переменных .)

0 голосов
/ 06 апреля 2020

Это будет работать:

def numPrint(number,roundplace):
    num = round(number, roundplace)
    if num > 0:
        output = ('+' + str(num))
    elif num < 0:
        output = (str(num))
    else:
        output = (' 0.' + '0' * roundplace)    

    while len(output) < (3 + roundplace): # previously you stopped after adding one trailing 0
        output = (output + '0')

    return output

print(numPrint(0.001, 3))
print(numPrint(0, 3))
print(numPrint(-0.0019, 3))
print(numPrint(-0.01, 3))
print(numPrint(0.1, 3))
0 голосов
/ 06 апреля 2020

Вы можете использовать встроенную функцию форматирования следующим образом:

print("{:+.4f}".format(0.09))

Подробнее о спецификации формата смотрите здесь:

https://docs.python.org/3.4/library/string.html#formatexamples

...