Using Python's Format Specification Mini-Language to align floats

前端 未结 4 2019
陌清茗
陌清茗 2020-12-03 07:44

I read that I can use Python\'s Format Specification Mini-Language to have more control over how strings are displayed. However, I am having a hard time figuring out how to

相关标签:
4条回答
  • 2020-12-03 08:13

    In case it helps, here's a similar function I use:

    def align_decimal(number, left_pad=7, precision=2):
        """Format a number in a way that will align decimal points."""
        outer = '{0:>%i}.{1:<%i}' % (left_pad, precision)
        inner = '{:.%if}' % (precision,)
        return outer.format(*(inner.format(number).split('.')))
    

    It allows a fixed precision after the decimal point.

    0 讨论(0)
  • 2020-12-03 08:19

    Here's another implementation based on .split('.') idea. It might be more readable. Split on '.', right-align the left part, left-align the right part:

    width = max(map(len, job_IDs)) # width of "job id" field 
    for jid, mem, unit in zip(job_IDs, memory_used, memory_units):
      print("Job {jid:{width}}: {part[0]:>3}{part[1]:1}{part[2]:<3} {unit:3}".format(
        jid=jid, width=width, part=str(mem).partition('.'), unit=unit))
    

    Output

    Job 13453 :  30     MB 
    Job 123   : 150.54  GB 
    Job 563456:  20.6   MB 
    
    0 讨论(0)
  • 2020-12-03 08:23

    This does it:

    import re
    
    job_IDs = ['13453', '123', '563456']
    memory_used = ['30', '150.54', '20.6']
    memory_units = ['MB', 'GB', 'MB']
    
    for i in range(len(job_IDs)):
        lh=re.match(r'(\d+)',memory_used[i]).group(1)
        if '.' in memory_used[i]:
            rh=re.match(r'(\d+)\.(\d+)',memory_used[i]).group(2)
            sep='.'
        else:
            rh=''    
            sep=' '
    
    
        my_str = "{item:15}{l:>6}{s:1}{r:6} {units:3}".format( 
        item='Job ' + job_IDs[i] + ':' , l=lh,s=sep,r=rh,units=memory_units[i])
    
        print my_str
    

    To get your precise out put, you need to break the strings on the optional '.'

    You could also convert those strings to floats.

    0 讨论(0)
  • 2020-12-03 08:29

    This is what you want:

    for i in range(len(job_IDs)):
        print "Job {item:15} {value[0]:>6}.{value[1]:<6} {units:3}".format(item=job_IDs[i]+':', value=memory_used[i].split('.') if '.' in memory_used[i] else (memory_used[i], '0'), units=memory_units[i])
    

    Here is how it works:

    This is the main part: value=memory_used[i].split('.') if '.' in memory_used[i] else (memory_used[i], '0'), which means: if there is a decimal point, split the string as the whole and decimal part, or set the decimal part to 0.

    Then in the format string: {value[0]:>6}.{value[1]:<6} means, the whole part shifted right, followed by a dot, then the decimal part shifted left.

    which prints:

    Job 13453:              30.0      MB
    Job 123:               150.54     GB
    Job 563456:             20.6      MB
    
    0 讨论(0)
提交回复
热议问题