代码之家  ›  专栏  ›  技术社区  ›  Bram Vanbilsen

字符串子项工作不正常

  •  0
  • Bram Vanbilsen  · 技术社区  · 8 年前

    我还有一个关于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")
    

    终止

    16: 03:51.452保存数据安装 1 原始=201

    16: 03:51.452保存数据安装 1. sub=201之后

    它在stackoverflow中看起来不错,但实际上在我的日志中并没有,而是被一个奇怪的矩形符号取代了。这篇文章将附有打印文本的图片。 有人看到这里发生了什么吗? enter image description here

    3 回复  |  直到 8 年前
        1
  •  1
  •   Paul Kulchenko    8 年前

    不要使用 sub 在这种情况下,作为 Â¥ 符号可能是多字节序列(取决于编码),因此使用 sub(2) 你是在中间切割而不是移除它。

    使用 gsub("[^%d%.]+","") 而是删除所有非数字部分。

        2
  •  0
  •   lhf    8 年前

    string.sub() 在上工作 字符串,而不是其上 字符 。字符串包含Unicode文本时会有所不同。

    如果数字位于字符串的末尾,请使用

    amount = tonumber(saveData.amounts[i]:match("%d+$"))
    
        3
  •  0
  •   sffc    8 年前

    Lua字符串是以下字符串 字节 ,而不是字符串 字符 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,可以使用UTF-8库,如 this one