2016-09-13 29 views
1

文字列内のすべての文字が1,2,3,4,5,6,7,8,9のいずれかであるかどうかを確認しようとしています。 0 OR小数点、および空白を含むかどうか。私は、コードのこの部分を使用していますが、それは働いていないと私は理由を理解することはできません。Lua - 文字列に有効な文字が含まれていることを確認してください

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 

スペースの一部を私は本当の== validAmountStringかどうかを確認しようとすると、働いているが、いくつかの理由私のif文は、動作を停止します。しかし、validAmountStringは私のprintステートメントに従って正しいブール値を返します。

助けが必要ですか? :)

+0

入力文字列を入力してください。 – Piglet

+0

私はたくさん試しました。ユーザーが入力する値です。入力値に正しいブール値が設定されています(つまり、「200」がtrueになります)。しかし、それが本当であっても、私のif文は渡されません。 –

+0

文字列に有効な数字が含まれているかどうか確認しようとしていますか?それが実際の質問であれば、あなたの質問を編集してください。 – ktb

答えて

1

のstring.Findされるだろう。このについて移動する簡単な方法

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

私はvalidAmountStringが真でない理由を言うことができない恐れてんだけど、あなたはブール値を比較する必要はありません。

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

こんにちは、私のコードを短縮していただきありがとうございます!しかし、私はまだそれが明らかに真実であるときにif文を渡していない理由はまだありません... –

+0

ここで彼が何をしているのですか:数字またはドットではない文字がテキストにある場合、それ以外の場合は真です。したがって、すべての文字を有効にする必要はありません。彼は単に無効なものが存在するかどうかを確認するだけです。 元のバージョンが正しくないので、結果をbtwに反転しました。 – Piglet

+0

私は本当に「偽りの真実」が何をしているのかを実際には知りません。私はそれのように使用したことはありません。 –

0

KingOfGamesYamiの答えを参照してください。彼は文字列パターンbtwを使用しています。詳細については、Luaリファレンスhttp://www.lua.org/manual/5.3/manual.html#6.4.1を参照してください。

"[^%d%。]"は、数字またはドットではないすべての文字と一致します。戻って何かが、nilを見つけるのであれば、あなたの文字列があるとして、あなたのプログラムが機能しない理由については

無効である(場合には、あなたの複雑な方法に固執したい:

あなたは、文字列のすべての文字を確認してください。それが数字かドットであれば真であるかどうかを確認してください。

文字列として "12A3"があるとしましょう 最後の文字がaであるため、validAmountStringの最終値はtrueです。あなたは本当に2回、次に "A"にはfalseを割り当てます。その後、あなたは再び真実を決めます。

ここで行うべきことは、validAmountString = validAmountString and true、それ以外の場合はvalidAmountString = falseを割り当てて、一度設定したfalseを上書きすることはできません。

無効な文字を入力すると、さらに効率的な方法は、単にチェックを止めることです。無効な文字がある場合は、それ以上の文字を確認する必要はありません。 breakを追加した後にvalidAmountString = false

+0

こんにちはピグレット、私はまだこれを理解しようとしています。しかし、私がKingOfGamesYamiのソリューションを使用すると、許容される数値の1つが見つかると、varを真に代入しませんか?私は文字のうちの1つだけが有効である必要はないので、私はそれらのすべてが必要です。また、私のvalidAmountStringはtrueですが、それでも私のif文は渡されません。理由はわかりません:/ –

+0

上記の表記を参照してください – Piglet

+0

もしこのアプローチを使用するのであれば、値をtrueに設定すべきではありませんループはまったくありません。誤った値にヒットしたら、それをfalseに設定してループを解除します(最後の段落で述べたように)。 – KingofGamesYami

関連する問題