简体   繁体   中英

String Formatting using python

Is there any way to do this kind of string formatting using PYTHON3

*************Food*************
initial deposit        1000.00
groceries               -10.15
restaurant and more foo -15.89
Transfer to Clothing    -50.00

where the numbers are aligned to the right and the texts are aligned to the left

ledger = [

    {'amount':10000,'description': 'initial deposit'},
    {'amount':-10.15,'description': 'groceries'},
    {'amount':-15.89,'description': 'restaurant and more food costings'},
    {'amount':-50,'description': 'Transfer to Clothing'}
    
]

please note that the value of the description key might depending on the user... so It might be much longer or it might also not these ones

if I do

string = ''
for dic in ledger:
    string += '{description:<23}{amount:>7.2f}'.format(**dic)
    string += '\n'

print(string)

the output is like this...

initial deposit        10000.00
groceries               -10.15
restaurant and more food costings -15.89
Transfer to Clothing    -50.00

but I want the description part to stop before the numbers

also the decimal points are not aligning

so what else am I missing here Thank You!!!!

You can do that by first calculating the with of the columns and then using f-strings. Also for the header of the table, str.center() is useful. Try:

ledger = [{'amount': 10000, 'description': 'initial deposit'},
          {'amount': -10.15, 'description': 'groceries'},
          {'amount': -15.89, 'description': 'restaurant and more food costings'},
          {'amount': -50, 'description': 'Transfer to Clothing'}]

width_desc = max(len(d['description']) for d in ledger)
width_amnt = max(len(f"{d['amount']:.2f}") for d in ledger)

print('Food'.center(width_desc + 1 + width_amnt, '*'))
for d in ledger:
    print(f"{d['description']:{width_desc}} {d['amount']:>{width_amnt}.2f}")

# *******************Food*******************
# initial deposit                   10000.00
# groceries                           -10.15
# restaurant and more food costings   -15.89
# Transfer to Clothing                -50.00

Assume that you have this variables:

initial_deposit = 1000.00
groceries = -10.15
restaurant = -15.89
transfer = -50.00

You could do something like this:

s = f"""
*************Food*************
initial deposit         {initial_deposit}
groceries               {groceries}
restaurant and more foo {restaurant}
Transfer to Clothing    {transfer}
"""
print(s) # <—- same result

By using f-strings you can do a lot of cool formating things in python 3. This guide is pretty good for learning about the different ways you can use f-strings in python.

To do a aligned table you can use fields like:

ages = {"Mike":10, "Leonardo":32, "Donatello":144, "Raphael":5}

for k, v in ages.items():
    print(f"{k:10}\t{v:10}")

Which will output

Mike            10        
Leonardo        32        
Donatello       144
Raphael         5

The f at the start of the string means its a f-string. The :10 after the variable means that it will be aligned in a ten character wide field. By default strings and most objects are left aligned while numbers are right aligned. To change the alignement you can use the < or > option before the number eg :<10 . You could automatically determine the field width or cut off strings that are too long easily.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM