px普贤教程PuXian
普贤教程 › 基础教程

类型转换

转换函数不多,但有两条与别的语言不同的规则必须记住:数字到字符串必须显式转,字符串到数字是严格解析。

四个转换函数

函数方向示例
str(v)任意值 → stringstr(42) → "42"
int(v)string / float → intint("42") → 42,int(3.9) → 3
float(v)string / int → floatfloat("1.25") → 1.25
bytes(s) / bytes_to_str(b)string ↔ bytes按 UTF-8 编解码

数字转字符串

px
print("共 " + str(3) + " 项")
print(str(3.0))
print(str(0.1 + 0.2))
text
共 3 项
3.0
0.30000000000000004

浮点保留 .0,不做"看起来像整数就省掉小数点"的优化——这对日志和序列化是好事,输出稳定可比对。但要注意浮点本身的精度:0.1 + 0.2 不等于 0.3,比较时用误差范围。

px
def feq(a, b):
    var d = a - b
    if d < 0:
        d = -d
    return d < 0.0000001

print(str(feq(0.1 + 0.2, 0.3)))
text
true

字符串转数字:严格解析

px
print(str(int("42")))
print(str(int("-7")))
print(str(float("1.25")))
text
42
-7
1.25
畸形输入直接报错int("abc")、int("12abc") 都会终止程序:
运行时错误: 错误 [R1002] 1:14: 无法将 'abc' 转为 int
这不是 Python 那种"能解析多少算多少"的宽容前缀解析。处理外部输入(表单、配置文件、请求参数)时,先校验再转换。
px
def to_int(s):
    var t = trim(s)
    if len(t) == 0:
        return Err("空值")
    var i = 0
    if t[0:1] == "-" or t[0:1] == "+":
        i = 1
    if i >= len(t):
        return Err("不是数字:" + s)
    while i < len(t):
        var c = t[i:i + 1]
        if c < "0" or c > "9":
            return Err("不是数字:" + s)
        i += 1
    return Ok(int(t))

print(str(to_int(" 42 ").ok()))
print(str(to_int("4x2").is_err()))
text
42
true

浮点转整数是截断

px
print(str(int(3.9)))
print(str(int(-3.9)))
text
3
-3

不是四舍五入,是直接砍掉小数部分。要四舍五入自己加 0.5 或用 round()(若当前版本提供,用 px lint 验证)。

字符串与字节

px
var s = "普贤"
var b = bytes(s)
print(str(len(s)))
print(str(bytes_len(b)))
print(bytes_to_str(b))
text
2
6
普贤

一个汉字在 UTF-8 里占 3 个字节。len() 数的是字符,bytes_len() 数的是字节——处理长度限制(比如数据库字段长度)时想清楚要哪一个。

常见转换组合

px
# 十六进制
print(int_to_hex(255, 2))
print(str(hex_to_int("ff")))
text
ff
255
记住三条就够了① 拼接前先 str();② 外部输入先校验再 int();③ 字符数与字节数用不同的函数。