String sub无法正常工作

时间:2016-09-14 14:15:44

标签: string lua substring corona

我还有另一个关于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中看起来很好但是因为¥实际上没有在我的日志中消失,而是用一个奇怪的矩形符号替换它。这篇文章附有印刷文字的图片。 有谁看到这里发生了什么?enter image description here

3 个答案:

答案 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库来实现相同的功能。