zoukankan      html  css  js  c++  java
  • 【Python】【字符串】符号、对齐和用字符填充

    一、用字符填充

    >>> '{0:*>10}'.format(10) #冒号前的0为索引位置
    '********10'
    >>> '{0:a>10}'.format(10)
    'aaaaaaaa10'
    >>> "{:010}".format(123)
    '0000000123'

    二、指定对齐方式

    1、左对齐 <

    >>> "{:0<10}".format(123)
    '1230000000'

    2、右对齐 >

    >>> "{:0>10}".format(123)
    '0000000123'

    3、居中 ^

    >>> "{:0^10}".format(123)
    '0001230000'

    三、实例:指定宽度打印价格列表

    width = int(input('Input data:'))
    
    price_width = 10
    item_width = width - price_width
    
    header_fm = '{{:{}}}{{:>{}}}'.format(item_width,price_width)
    fmt = '{{:{}}}{{:>{}.2f}}'.format(item_width,price_width)
    
    print('='*width)
    print(header_fm.format('Item','Price'))
    print('-'*width)
    print(fmt.format('Apples',0.4))
    print(fmt.format('Pears',0.5))
    print(fmt.format('Cantaloupes',1.92))
    print('='*width)
    
    ===================================
    Item                          Price
    -----------------------------------
    Apples                         0.40
    Pears                          0.50
    Cantaloupes                    1.92
    ===================================

    1、花括号可以转义花括号

           上述是教程里的案例以及输出内容,但是不太理解以下问题:

           假定 item_width = 20,price_width = 15,那么 '{{:{}}}{{:>{}}}'.format(item_width,price_width) 就等于'{{:{}}}{{:>{}}}'.format(20,15),我用python自带的idle获取表达式'{{:{}}}{{:>{}}}'.format(20,15)的输出结果为

    >>> '{{:{}}}{{:>{}}}'.format(20,15)
    '{:20}{:>15}'

            从之前的学习认知,我们可以知道,一对{}代表一个占位符,对应一个字符串。那么'{{:{}}}'.format(20) 应该是输出 '{{:20}}',怎么会是{:20}呢,百思不得其解,百度了一波没啥作用。后面在论坛上看到有人说花括号可以转义花括号,这个问题就迎刃而解了

    2、中文排版对齐问题

           搬移代码的时候,自动把入参换成中文了。发现同样的代码,英文输出结果是对齐的,符合预期;而中文存在字符格式化不整齐的现象,存在一定偏移。

    ===================================
    Item                          Price
    -----------------------------------
    Apples                         0.40
    Pears                          0.50
    Cantaloupes                    1.92
    ===================================
    ===================================
    Item                          Price
    -----------------------------------
    苹果                             0.400.50
    哈密瓜                            1.92
    ===================================

           原因是在打印多组中文的时候,不是每组中文的字符串宽度都一样,当中文字符宽度不够的时候,程序采用英文空格填充,中英文空格宽度不一样,就会导致输出文本不整齐。所以解决方法就是在宽度不够时采用中文空格填充,中文空格的编码为chr(12288)。最后的代码以及实现效果如下:

    price_width = 10
    item_width = width - price_width
    
    header_fm = '{{:{2}<{0}}}	{{:{2}<{1}}}'.format(item_width,price_width,chr(12288)) #	 当前八个字符的单元结束,进入到下一个八个字符的单元中
    fmt = '{{:{2}<{0}}}	{{:{2}<{1}.2f}}'.format(item_width,price_width,chr(12288))
    
    print('='*50)
    print(header_fm.format('名称','价格'))
    print('-'*50)
    print(fmt.format('苹果',0.4))
    print(fmt.format('',0.5))
    print(fmt.format('哈密瓜',1.92))
    print('='*50)
    ==================================================
    名称                           价格        
    --------------------------------------------------
    苹果                           0.40      
    梨                            0.50      
    哈密瓜                          1.92      
    ==================================================

    (1){{:{2}<{0}}},字符串默认向左对齐,为什么还要加对齐符<

    ---如果不加,第一次格式化后,表达式='{:u300010}{:>15},中文空格u3000和宽度10难以区分

    (2){{:{2}<{1}}},价格从右对齐改成了左对齐

    ---应该是因为中文和价格数字的占位不同,所有向右对齐能解决空格补充问题,但是不能解决字符串本身的长度差异,所以向左对齐相对看起来比较整齐点

    (3)遗留一个问题,怎么让===...自适应表宽

  • 相关阅读:
    android 网络加载图片,对图片资源进行优化,并且实现内存双缓存 + 磁盘缓存
    Web前端框架与类库的思考
    android应用开发(十):widget的使用
    响应式WEB设计的9项基本原则
    谈一下关于CQRS架构如何实现高性能
    迪杰斯特拉算法——PAT 1003
    Android开发-SQLite数据库
    寻找水王(2)
    PAT-1003
    PAT-1002
  • 原文地址:https://www.cnblogs.com/12345zjl/p/15009984.html
Copyright © 2011-2022 走看看