我还有另一个关于lua的问题。我已经创建了一种计算某些价格总量的方法。价格采用以下格式:500英镑。所以要将它们转换为数字我使用string:sub()和tonumber(),但是我得到了一些奇怪的结果。这是我的代码:`
function functions.calculateTotalAmount()
print("calculating total amount")
saveData.totalAmount = 0
print("There are " .. #saveData.amounts .. " in the amount file")
for i=1, #saveData.names do
print("SaveData.amounts[" .. i .. "] original = " .. saveData.amounts[i])
print("SaveData.amounts[" .. i .. "] after sub= " .. saveData.amounts[i]:sub(2))
print("totalAmount: " .. saveData.totalAmount)
if saveData.income[i] then
saveData.totalAmount = saveData.totalAmount + tonumber(saveData.amounts[i]:sub(2))
else
saveData.totalAmount = saveData.totalAmount - tonumber(saveData.amounts[i]:sub(2))
end
end
totalAmountStr.text = saveData.totalAmount .. " " .. currencyFull
loadsave.saveTable(saveData, "payMeBackTable.json")
端
我在for循环中打印出一些信息来确定问题,这就是for循环中前两个打印语句的打印内容:
16:03:51.452 SaveData.amounts 1原件=¥201
16:03:51.452在sub = 201
之后的SaveData.amounts 1它在stackoverflow中看起来很好但是因为¥实际上没有在我的日志中消失,而是用一个奇怪的矩形符号替换它。这篇文章附有印刷文字的图片。 有谁看到这里发生了什么?
答案 0 :(得分:1)
在这种情况下不要使用sub
,因为¥
符号可能是多字节序列(取决于编码),因此使用sub(2)
您正在切割它中间而不是删除它。
使用gsub("[^%d%.]+","")
代替删除所有非数字部分。
答案 1 :(得分:0)
string.sub()
适用于字符串的字节,而不适用于字符。当字符串包含Unicode文本时会有区别。
如果数字位于字符串的末尾,请使用
将其解压缩amount = tonumber(saveData.amounts[i]:match("%d+$"))
答案 2 :(得分:0)
Lua字符串是 bytes 的字符串,而不是字符的字符串。 ASCII字符长度为1个字节,但大多数其他字符消耗多个字节,因此使用string.sub()
无法正常工作。
有几种标准可以在字节和字符(或代码点)之间进行转换,但到目前为止,网络上最常见的是UTF-8。如果您使用的是Lua 5.3或更高版本,则可以使用新的built-in functions来执行UTF-8操作。例如,要获取UTF-8字符串的子字符串,您可以执行以下操作:
-- Simple version without bounds-checking.
function utf8_sub1(s, start_char_idx, end_char_idx)
start_byte_idx = utf8.offset(s, start_char_idx)
end_byte_idx = utf8.offset(s, end_char_idx + 1) - 1
return string.sub(s, start_byte_idx, end_byte_idx)
end
-- More robust version with bounds-checking.
function utf8_sub2(s, start_char_idx, end_char_idx)
start_byte_idx = utf8.offset(s, start_char_idx)
end_byte_idx = utf8.offset(s, end_char_idx + 1)
if start_byte_idx == nil then
start_byte_idx = 1
end
if end_byte_idx == nil then
end_byte_idx = -1
else
end_byte_idx = end_byte_idx - 1
end
return string.sub(s, start_byte_idx, end_byte_idx)
end
s = "¥201"
print(string.sub(s, 2, 4)) -- an invalid byte sequence
print(utf8_sub1(s, 2, 4)) -- "201"
print(utf8_sub2(s, 2, 4)) -- "201"
print(utf8_sub1(s, 2, 5)) -- throws an error
如果你没有Lua 5.3,你可以使用像this one这样的UTF-8库来实现相同的功能。