2016-07-03 115 views
2

任务: ATM机允许4或6位密码和PIN码不能包含任何东西,但正是4位数字或精确6位数字。 如果该函数传递了有效的PIN字符串,则返回true,否则返回false。简单PIN验证

我的解决办法:

function validatePIN (pin) { 
    //return true or false 
    if (!isNaN(pin) && Number.isInteger(pin) && pin.toString().length == 4 || pin.toString().length == 6) { 
    return true 
    } else { 
    return false 
    } 
} 

我得到的唯一错误是当我通过4位数字作为字符串("1234") - 它等于false

+1

添加为函数的第一行:'销=号码(PIN);' – BadIdeaException

+1

好吧,不是唯一的错误 - 它也返回真正的字符串,如“1234ab”。 – JJJ

+0

'!isNaN(pin)'---这个检查没有任何意义。 – zerkms

回答

2
function validatePIN (pin) { 
    // return true or false 
    if (typeof pin === "string" && !~pin.indexOf('.') && !isNaN(Number(pin)) && (pin.length === 4 || pin.length === 6)) { 
    return true; 
    } else { 
    return false; 
    } 
} 

编辑:

现在只接受一个字符串,而 “1234.0” 失败。

EDIT2:

0000和000000成功,但也许不是最完美的解决方案:)

EDIT3:

增加了一个更短的例子,通过GingerPlusPlus建议。

function validatePIN (pin) { 
    // return true or false 
    return typeof pin === "string" && !~pin.indexOf('.') && !isNaN(Number(pin)) && (pin.length === 4 || pin.length === 6); 
} 
+1

你读过整个问题? – zerkms

+0

^现在重新读它与思想,谢谢。 – b00t

+0

@ b00t,尝试'0000'或'000000' - 它等于'FALSE' – Archie

0

可以使用Array.prototype.every()Array.prototype.some()String.prototype.match()

<input type="text" /> 
 
<button>validate pin</button> 
 
<script> 
 
    var validatePIN = (args) => {[...args] = args; 
 
return args.every(v => v.match(/\d/)) && 
 
    [4, 6].some(n => args.length === n)}; 
 

 
    document.querySelector("button") 
 
    .addEventListener("click", (e) => 
 
    alert(validatePIN(e.target.previousElementSibling.value)) 
 
) 
 
</script>

+1

如果你使用'.mat ch()'为什么不用一个正则表达式验证整个PIN? @nnnnnn你是正确的(而且,不'.match()'返回null如果不匹配,从而导致一个错误,当你尝试检查长度?) – nnnnnn

+0

。只是一个可选的方法。通过zerkms的'RegExp'应该返回预期的结果。 – guest271314

+0

那么这是一个有趣的看待它的方式。 – nnnnnn

1
function validatePIN(pin) { 
var isNumber = /^\d+$/.test(pin) && (pin.length == 4 || pin.length == 6) 
return isNumber 
} 

validatePIN('0193') 

//returns true