【问题标题】:Lua - Check if string contains valid charactersLua - 检查字符串是否包含有效字符
【发布时间】:2017-01-20 23:22:39
【问题描述】:

我正在尝试检查我的字符串中的所有字符是否都是以下数字之一:1,2,3,4,5,6,7,8,9,0 或小数点,以及它们是否是否包含空格。我正在使用这段代码,但它不起作用,我不知道为什么:

    print("Confirming added item")
    local validAmountString = true
    print(addScreen.amountTxtField.text)
    for i = 1, #addScreen.amountTxtField.text do
        local c = addScreen.amountTxtField.text:sub(i,i)
        print("Char " .. i .. " in the amount textflied is " .. c)
        if c == "0" or c == "1" or c == "2" or c == "3" or c == "4" or c == "5" or c == "6" or c == "7" or c == "8" or c == "9" or c == "." then
            validAmountString = true
        else
            validAmountString = false
        end
        print(validAmountString)
    end
    if string.gsub(addScreen.nameTxtField.text, "%s+", "") ~= "" and string.gsub(addScreen.amountTxtField.text, "%s+", "") ~= "" and validAmountString == true then
        --Proceed...
    end

空格部分正在工作,但由于某种原因,当我尝试在 if 语句中检查 validAmountString == true 时,它​​停止工作。根据我的打印语句,validAmountString 返回正确的布尔值。

有什么帮助吗? :)

【问题讨论】:

  • 请提供输入字符串
  • 我已经尝试了很多。这是用户填写的值。我的输入得到了正确的布尔值(即“200”将导致 true)。但即使它是真的,它也不会通过我的 if 语句。
  • 所以您想查看字符串是否包含有效数字?如果这是您的实际问题,请编辑您的问题。
  • 或小数点。我觉得我的问题对这个主题的内容有一个坚实的初步了解。检查字符串中的单个字符。
  • The XY problem。您在询问字符串是否仅包含数字或小数点。您确定您真的不想知道字符串是否包含有效数字吗?带两个小数点的字符串是否有效? tonumber() 仅在存在有效数字和任意数量的前导或尾随空格时返回字符串表示的数字,否则返回 nil。从那里你可以检查字符串中是否真的有一个数字。

标签: string lua coronasdk


【解决方案1】:

更简单的方法是 string.find

local validAmountString = not addScreen.amountTxtField.text:find( "[^%d%.]" )

恐怕我不知道为什么 validAmountString 不正确,但您不必比较布尔值。

if (validAmountString) then
--is equivilent to
if (validAmountString == true) then

【讨论】:

  • 您好,感谢您缩短我的代码!但我仍然不明白为什么当它显然是真的时它没有通过 if 语句......
  • 他在这里做的是:如果文本中有任何字符不是数字或点,则结果为假,否则为真。因此不必检查每个字符是否有效。他只是检查是否存在任何无效我将他的结果倒过来,因为原始版本不正确。
  • 我真的不明白“和假或真”的事情最后在做什么。我从来没有那样用过。
  • a = b 和 c 或 d 如果 b 为真,则将 c 分配给 a,否则将分配 d。所以如果 string.find 的结果不是 nil,validAmountString 将为 false,否则为 true。阅读:lua-users.org/wiki/TernaryOperator
  • 糟糕,因此没有使用建议的代码行将正确的布尔值分配给 var:“local validAmountString = addScreen.amountTxtField.text:find("[%d%.]")和假或真”。对于像“fdsdfs”这样的字符串,它也会返回true。
【解决方案2】:

要检查您的字符串,请参阅 KingOfGamesYami 的回答。顺便说一句,他正在使用一种叫做字符串模式的东西。查看 Lua 参考 http://www.lua.org/manual/5.3/manual.html#6.4.1 了解详细信息。

"[^%d%.]" 匹配每个不是数字或点的字符。因此,如果 find 返回的结果为 nil,则您的字符串无效

为什么你的程序不能按原样运行(如果你想坚持你的复杂方式:

您检查字符串的每个字符。如果是数字或点,则为真,如果不是,则为假。

假设您将“12A3”作为字符串。 那么validAmountString的最终值为true,因为最后一个字符是一个数字。因此,您分配 true 2 次,然后为“A”分配 false,然后再次分配 true。你搞砸了你的总结果。

你应该在这里做的是要么分配validAmountString = validAmountString and true,要么分配validAmountString = false,这样你就永远不能覆盖false,一旦设置。

更好、更有效的方法是在遇到无效字符后简单地停止检查。如果您发现一个无效字符,则无需检查其他字符。 所以只需在validAmountString = false 之后添加一个break

【讨论】:

  • 嗨小猪,我还在努力解决这个问题。但是,如果我使用 KingOfGamesYami 的解决方案,它不会在找到允许的数字之一后将 var 分配为 true 吗?因为我不仅需要其中一个字符有效,我还需要所有字符。另外,我的 validAmountString 是真的,但它仍然没有通过我的 if 语句,我就是不知道为什么:/
  • 见上面的推荐
  • 如果他要使用这种方法,他根本不应该在循环中将值设置为 true。一旦遇到不正确的值,请将其设置为 false 并中断循环(如您在上一段中所说)。
【解决方案3】:

您不需要循环来检查它是否包含有效字符。

你可以简单地做 tonumber(string)。如果字符串中有除数字以外的任何字符,它将返回 nil。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 2011-11-09
    • 2013-05-18
    • 2013-10-26
    • 1970-01-01
    • 2013-07-26
    • 2021-12-20
    • 2014-09-17
    相关资源
    最近更新 更多