介绍一些Python str类的方法

遇到一个题目,需要在输出时保留六位小数位数。一开始选择比较常用的方案

x = 1 / 3
f'{x:.6}' # 或Python3.6 之前 '{:.6}'.format(x)

上面的代码正确的返回了'0.333333',但是当x = 1 / 2时,由于小数只有一位,这个方案的结果就是'0.5'了,而不是预期中的'0.500000'

如果换成f'{x:06.6}',当x = 1 / 2时,结果是'0000.5',表示总共六位,不足的在前面补0。

这时候我考虑在str类中看看还有没有其他合适的方法,发现了几个以前忽视掉的使用方法。

str.zfill()

Docstring:
S.zfill(width) -> str

Pad a numeric string S with zeros on the left, to fill a field
of the specified width. The string S is never truncated.
Type:      method_descriptor

这是一个在字符串前年补'0'的方法,'0.5'.zfill(6) == '0000.5',有些类似于f'{x:06}',并不能解决上述的问题。

str.rjust()

Docstring:
S.rjust(width[, fillchar]) -> str

Return S right-justified in a string of length width. Padding is
done using the specified fill character (default is a space).
Type:      method_descriptor

类似于str.zfill(),不过可以自定义补充的字符,并且可以是很多位的字符串。'0.5'.zfill(6)就相当于'0.5'.rjust(6, '0')。同样,在文章开始的那个问题中也是不适用的。

str.ljust()

Docstring:
S.ljust(width[, fillchar]) -> str

Return S left-justified in a Unicode string of length width. Padding is
done using the specified fill character (default is a space).
Type:      method_descriptor

和str.rjust()相对应,在字符串的右边填充自定义的字符('l'表示原字符串放到了左边)。这个方法可以用来解决上述的问题。

x = 0.5
str(x).ljust(8, '0') == '0.500000'

由于整数部分是0,加上小数点代表的一位,总共需要补'0'到八位来实现小数部分为六位。

对于一般意义上的小数,需要先计算一下最后的字符串的宽度。

这里写一个通用的强保留n位小数的函数。

def keep_n_decimal_digits(x, n):
    if isinstance(x, int):
        return str(x) + '.' + '0' * n
    else:
        origin = f'{round(x, n)}'
        numOfDecimalDigits = len(origin) - len(str(int(x))) - 1
        return origin.ljust(len(origin) + n - numOfDecimalDigits, '0')

结语

很多语言的常用类型中都有一些很实用的方法用于解决常见的各种问题,这需要我们善于发现的眼镜。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开源优测

Python3冒泡排序

Python3冒泡排序 概述 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的数列,一次比较两个元素,如果他...

3586
来自专栏take time, save time

初级程序员面试不靠谱指南(六)

五.很强很伟大的函数指针     我想看到这个标题中“函数指针”几个字之后,估计有一半人会选择关掉界面,因为我最开始学习C语言的时候这一章我曾无数次跳过,看到书...

34610
来自专栏Java编程

10个有关String的面试问题

下面是面试中最容易问到的有关String的问题。

1K2
来自专栏JavaEE

Java面试题-01前言:面试题:总结:

1885
来自专栏take time, save time

初级程序员面试不靠谱指南(五)

四、递归的第一次亲密接触     我经常会想,如果给没有学过计算机或者数学的人说递归这个词他们脑中会怎样理解这个词的意思。递归这个概念在面试中出现的概率大于85...

3458
来自专栏noteless

[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念

说起来好像很啰嗦,但是如果有人告诉你 通过sin(x) 计算后, x的值被改变了,你不会觉得异常奇怪么

1122
来自专栏编程

关于python字典类型最疯狂的表达方式

[译]关于python字典类型最疯狂的表达方式 一个Python字典表达式谜题 这个子字典是从哪里来的 Umm..好吧,可以得到什么结论呢? 一篇来自 Dan ...

21110
来自专栏诸葛青云的专栏

C语言夺命题十例,为啥C语言的总是这么恶趣味?

这些问题测试了C语言的高级知识,包括一些很少使用的特性。有效的C编程需要对诸如未定义的行为,递归和指针算术等概念有深入的理解,但是这些故意复杂的例子并不代表现实...

2003
来自专栏编程

Python函数之一切皆对象

今天我们要讲的是 对象 避免误会,常老师先澄清一下,这里面说的对象指的是object,不是你的lover,也不是你的sweetheart…… 有的小伙伴可能会觉...

1997
来自专栏编程

Python数据类型之字符串第四季

各位小伙伴们 “黑一”快乐 本节课非常非常重要 请各位小伙伴 一定认真理解和学习 技术要点: 内建函数 函数的理解 如何使用一个函数 capitalize()函...

1840

扫码关注云+社区

领取腾讯云代金券