Roblox Guidebook知识库
简体中文 ⌄

开发 / ROBLOX

Luau 进度文字:把数字与显示内容分开

创建清楚的进度说明,明确处理字符串转换失败,并避免把显示的数量当成文字排序。

更新日期:

从一个小型配送计数开始 #

设想一条练习配送路线:共有二十个包裹,已经完成七个。用于计算的是数字 7,而给人阅读的说明是这个数字的另一种表示。先决定哪个变量保存已完成数量,哪个表达式生成说明,再考虑连接真实界面对象。这样可以单独观察数据与文字之间的边界。

本练习中的数值由作者预先选择。代码不读取玩家消息,不发放奖励,也不保存进度。控制台输出足以展示字符串操作,但不能据此声称 Roblox 界面已经连接。运行前写下完整预期内容,包括空格和符号,成功与否就有明确判断依据。

从数字生成说明 #

在 Luau 解释器或独立练习脚本中运行第一个示例。completed 与 total 都保持数字类型。tostring 取得数字的文字表示,两个连续句点连接各部分。空格来自字符串本身,并非自动补充。第一行应完整输出 Parcels: 7 / 20,斜线两侧的空格也属于预期内容。

第二行使用 string.format 和 %d 占位符处理相同的整数,得到同样的说明。格式化不会修改 completed。以后增加数字计数时,需要根据新值重新生成说明。此前保存的文字不会自己更新,否则它可能仍显示七个,而真实完成数量已经改变。

数字与说明打开大图 ↗
原创图解:单独保留数字,从当前数值生成说明。
local completed = 7
local total = 20
local caption = "Parcels: " .. tostring(completed) .. " / " .. tostring(total)
print(caption)
print(string.format("Parcels: %d / %d", completed, total))

明确选择空格与措辞 #

连接字符串不会在相邻部分之间主动增加分隔符。如果把 Parcels 与数字直接相连,缺少冒号或空格,阅读会更困难。把标点保存在一个清楚可见的模板里,而不是分散到不相关的语句中。检查时比较完整输出,而不只是确认出现了数字。

整数占位符适用于本练习,因为包裹按整数计算。小数需要另外决定显示规则,不能把 %d 理解为保留所有小数位的承诺。百分比、四舍五入和单位改变都是之后的设计决定。先写出新规则下的预期说明,再修改与验证代码,不要沿用旧结论。

转换已知文字并检查失败 #

第二个示例从作者指定的字符串 "7" 开始。tonumber 尝试取得数字,转换失败时返回 nil。明确检查 nil 的分支报告无效进度,并返回备用说明。转换成功才创建正常格式的文字。因此无效文本不会被悄悄当成零,让错误从结果中消失。

负面测试使用 "seven"。它输出 Invalid progress,然后输出 Parcels: unavailable。转换并不等于完整游戏规则:未来若接受这类数值,还可能需要允许范围与整数要求。本练习没有玩家输入,也没有显示聊天文字,这些功能不属于此次验证范围。

检查转换打开大图 ↗
原创转换图解:nil 进入明确的失败分支。
local function progressCaption(raw)
    local completed = tonumber(raw)
    if completed == nil then
        print("Invalid progress")
        return "Parcels: unavailable"
    end
    return string.format("Parcels: %d / %d", completed, 20)
end
print(progressCaption("7"))
print(progressCaption("seven"))

不要把进度说明作为数字排序 #

比较字符串 "100" 与 "20" 时,询问的是文字顺序而非数字大小。第一个字符可能在后面的数字参与判断之前就决定结果。在这个练习中,字符串比较返回 true,然而数字 100 大于数字 20。这个差异可以帮助提前发现数据类型选错的问题。

比较数量应保留数字,或转换已知字符串并在比较前处理 nil。给可见说明补前导零不能替代这种区分,除非固定宽度的文字排序确实是设计目标。为了阅读选择的外观不应成为判断完成多少工作的依据,也不应负责决定哪个数值更大。

分开处理转换与游戏限制 #

成功转换只说明文字可以理解为数字,不说明它适合表示包裹数量。负数、小数或超过 total 的数值都可能是数字,却违反设想中的规则。写下这些决定,再设计实际项目的检查;否则接手者容易误认为一次转换已经解决全部合法性问题。

演示刻意只检查一个已知数字字符串与一个明显无效的单词。可执行断言还检查文字排序与数字排序的差异。它们不证明所有输入、所有语言或已发布游戏的行为。交接时写清有限范围,并把仍待增加的领域规则检查列为后续任务。

翻译说明但保持数据含义 #

本地语言解释可以说明文字的用途,但示例保留固定英文输出,让所有语言的读者能够重复相同检查。在真实本地化界面中,应把措辞与标点放进适当的翻译模板。进度的数字含义与模板语言、词序保持独立,计算不能依赖已经显示的文字。

以后连接真实界面时,分别观察较长译文和从右向左布局。本文章没有演示这一连接,也没有证明文字适合手机屏幕。可以迁移的原则是数据边界:数字负责计算,本地化字符串负责阅读。真实对象的大小、方向与可见更新,需要各自的检查记录。

输入预期输出
数字 7 与 20Parcels: 7 / 20
字符串 7Parcels: 7 / 20
单词 seven错误及备用说明
字符串 100 与 20文字比较返回 true

交接可重复的结果 #

把两个示例源码、预期输出与断言文件保存在一起。记录实际使用的解释器,以及执行是否成功结束。另一位开发者应当无需账号、服务器或已发布游戏访问权限,就能重复说明与错误分支。仅有文件名不能代替实际源码和输出证据。

扩展前确认:计算仍然使用数字,失败转换有明确分支,完整说明包括计划中的分隔符。然后单独描述下一步真实集成。正确控制台输出证明这些字符串操作,而不证明进度已经保存、玩家已经看到界面、奖励已经发放或任何现有项目已经改变。

记录交接内容
数据数字 completed 与 total
说明模板及完整输出
失败nil 分支与备用文字
验证解释器及实际输出

原始资料

Roblox — Official documentation