字符串转换和格式化 — Python 文档
字符串转换和格式化
用于数字转换和格式化字符串输出的函数。
- int PyOS_snprintf(char *str, size_t size, const char *format, ...)
- 根据格式字符串 format 和额外的参数,输出不超过 size 个字节到 str。 请参阅 Unix 手册页 snprintf(2)。
- int PyOS_vsnprintf(char *str, size_t size, const char *format, va_list va)
- 根据格式字符串format和变量参数列表va输出不超过size个字节到str。 Unix 手册页 vsnprintf(2)。
PyOS_snprintf() 和 PyOS_vsnprintf() 包装了标准 C 库函数 snprintf()
和 vsnprintf()
。 它们的目的是在极端情况下保证一致的行为,而标准 C 函数则没有。
包装器确保 str*[*size-1] 在返回时始终为 '\0'
。 他们永远不会写入超过 size 个字节(包括尾随 '\0'
到 str. 这两个函数都需要 str != NULL
、size > 0
和 format != NULL
。
如果平台没有 vsnprintf()
并且避免截断所需的缓冲区大小超过 size 超过 512 个字节,则 Python 会以 Py_FatalError 中止。
这些函数的返回值 (rv) 应解释如下:
0 <= rv < size
时,输出转换成功,rv字符被写入str(不包括str*[的尾随'\0'
字节) *rv])。- 当
rv >= size
时,输出转换被截断,并且需要具有rv + 1
字节的缓冲区才能成功。 str*[*size-1] 在这种情况下是'\0'
。 - 当
rv < 0
时,“发生了不好的事情。” str*[*size-1] 在这种情况下也是'\0'
,但 str 的其余部分未定义。 错误的确切原因取决于底层平台。
以下函数提供与语言环境无关的字符串到数字的转换。
- double PyOS_string_to_double(const char *s, char **endptr, PyObject *overflow_exception)
将字符串
s
转换为double
,在失败时引发 Python 异常。 接受的字符串集对应于 Python 的 float() 构造函数接受的字符串集,除了s
不能有前导或尾随空格。 转换与当前语言环境无关。如果
endptr
是NULL
,则转换整个字符串。 如果字符串不是浮点数的有效表示,则引发 ValueError 并返回-1.0
。如果 endptr 不是
NULL
,则尽可能多地转换字符串并将*endptr
设置为指向第一个未转换的字符。 如果没有字符串的初始段是浮点数的有效表示,则将*endptr
设置为指向字符串的开头,引发 ValueError,并返回-1.0
。如果
s
表示的值太大而无法存储在浮点数中(例如,"1e500"
在许多平台上都是这样的字符串),那么如果overflow_exception
是 [ X155X] 返回Py_HUGE_VAL
(带有适当的符号)并且不设置任何异常。 否则,overflow_exception
必须指向一个 Python 异常对象; 引发该异常并返回-1.0
。 在这两种情况下,将*endptr
设置为指向转换值后的第一个字符。如果在转换过程中发生任何其他错误(例如内存不足错误),请设置适当的 Python 异常并返回
-1.0
。2.7 版中的新功能。
- double PyOS_ascii_strtod(const char *nptr, char **endptr)
将字符串转换为
double
。 此函数的行为类似于标准 C 函数strtod()
在 C 语言环境中的行为。 它在不更改当前语言环境的情况下执行此操作,因为这不是线程安全的。PyOS_ascii_strtod() 通常应用于读取配置文件或其他应与区域设置无关的非用户输入。
有关详细信息,请参阅 Unix 手册页 strtod(2)。
2.4 版中的新功能。
自 2.7 版起已弃用: 改用 PyOS_string_to_double()。
- char *PyOS_ascii_formatd(char *buffer, size_t buf_len, const char *format, double d)
使用
'.'
作为小数点分隔符将double
转换为字符串。 format 是指定数字格式的printf()
样式的格式字符串。 允许的转换字符为'e'
、'E'
、'f'
、'F'
、'g'
和'G'
。返回值是一个指向 buffer 的指针,带有转换后的字符串,如果转换失败则返回 NULL。
2.4 版中的新功能。
自 2.7 版起已弃用: 此函数已在 Python 2.7 和 3.1 中删除。 请改用
PyOS_double_to_string()
。
- char *PyOS_double_to_string(double val, char format_code, int precision, int flags, int *ptype)
使用提供的 format_code、precision 和 flags 将
double
val 转换为字符串。format_code 必须是
'e'
、'E'
、'f'
、'F'
、'g'
、[ X95X] 或'r'
。 对于'r'
,提供的 precision 必须是0
并被忽略。'r'
格式代码指定标准的 repr() 格式。flags 可以是值 Py_DTSF_SIGN、Py_DTSF_ADD_DOT_0 或 Py_DTSF_ALT 中的零个或多个,或一起计算:
Py_DTSF_SIGN 意味着总是在返回的字符串前面加上一个符号字符,即使 val 是非负的。
Py_DTSF_ADD_DOT_0 表示确保返回的字符串不会像整数。
Py_DTSF_ALT 表示应用“替代”格式规则。 有关详细信息,请参阅 PyOS_snprintf()
'#'
说明符的文档。
如果 ptype 为非 NULL,则其指向的值将设置为 Py_DTST_FINITE、Py_DTST_INFINITE 或 Py_DTST_NAN之一表示 val 分别是有限数、无限数或非数。
返回值是一个指向 buffer 的指针和转换后的字符串,如果转换失败,则返回 NULL。 调用者负责通过调用 PyMem_Free() 来释放返回的字符串。
2.7 版中的新功能。
- double PyOS_ascii_atof(const char *nptr)
以与语言环境无关的方式将字符串转换为
double
。有关详细信息,请参阅 Unix 手册页 atof(2)。
2.4 版中的新功能。
自 3.1 版起已弃用: 改用 PyOS_string_to_double()。
- char *PyOS_stricmp(char *s1, char *s2)
字符串不区分大小写的比较。 该函数的工作原理与
strcmp()
几乎相同,只是它忽略了大小写。2.6 版中的新功能。
- char *PyOS_strnicmp(char *s1, char *s2, Py_ssize_t size)
字符串不区分大小写的比较。 该函数的工作原理与
strncmp()
几乎相同,只是它忽略了大小写。2.6 版中的新功能。