我有一个JavaScript计算器,它使用以下代码处理计算输入字段中的小数点(也在下面):
$('#button-dot').click(function() {
var lastChar = $('#disp').val().slice(-1);
var firstChar = $('#disp').val().slice(0);
if ($('#disp').hasClass("result")) {
$('#disp').removeClass("result").val("");
addChar(this.form.display,'0' + '.');
}
else if (lastChar == '.'){
// DO NOTHING
}
else if (lastChar == '1' || lastChar == '2' || lastChar == '3' || lastChar == '4' || lastChar == '5' || lastChar == '6' || lastChar == '7' || lastChar == '8' || lastChar == '9' || lastChar == '0' && firstChar != '0'){
addChar(this.form.display,'.');
}
else if (firstChar == '0'){
addChar(this.form.display,'0' + '.');
}
else {
addChar(this.form.display,'0' + '.');
}
$('#disp').removeClass("result");
});
其中addChar
函数由:
function addChar(input, character) {
if (input.value == null || input.value == "0" ) {
input.value = character
}
else {
input.value += character
}
};
和输入字段:
<INPUT NAME="display" ID="disp" VALUE="0" SIZE="28" MAXLENGTH="25"/>
我希望以这样的方式增强我的代码,即限制用户输入相同数字的多个小数(如下所示),同时仍允许计算字符串中的多个小数(也在下面):
避免这种情况 -
但请允许 -
我已经调查了regex
因为我理解我的问题的解决方案可能会以某种方式涉及它,但我不确定如何实现它(我的JavaScript技能仍在进行中!)。
我还想过将字符串与任何操作数(-,+,/,*,%
)分开并检查结果数组的每个元素是否为小数点,但我认为这可能有点混乱。
有什么想法吗?
答案 0 :(得分:2)
我会创建一个计数器变量,然后在每次遇到.
时为其添加一个,同时每次找到操作数时重置为零。这样,如果您的计数器在for
循环结束时不止一个,那么您可以提醒用户摆脱点。
的伪代码:
// Do this input.length - 1 times:
// store current char in var curChar.
// check if curChar is a dot. If it is, counter++
// check if curChar is an operand. If it is, counter = 0.
// After the for loop, check if counter is 1 or 0. If it is either of
// these, the user entered an acceptable input. Otherwise, they need to
// take out the extra dots.
答案 1 :(得分:2)
您可以使用单个正则表达式轻松完成此操作:
^(?:(?:\d+(?:\.\d*)?|\.\d+)(?:[-+/*%]|$))+$
解释
^ # Begin of string
(?: # Group
(?: # A number
\d+
(?: \. \d* )?
| \. \d+
)
(?:
[-+/*%] # Operator
| # or,
$ # EOS
)
)+ # End group, do 1 to many times
$ # End of string
答案 2 :(得分:0)
是的,您可以使用以下正则表达式来验证用户输入:
private EntityManagerFactory entityManagerFactory;
private JpaTransactionManager jpaTransactionManager;
public JpaConfig( Properties props )
{
...
if ( Boolean.parseBoolean( props.getProperty( "isTransactional" ) )
{
jpaTransactionManager =
new JpaTransactionManager( entityManagerFactory );
}
}
^\d+(\.\d+)?([+\-*\/]\d+(\.\d+)?)*$
匹配小数\d+(\.\d+)?
与运营商匹配
[+\-*\/]
$('#disp').on('input', function() {
if (this.value.match(/^\d+(\.\d+)?([+\-*\/]\d+(\.\d+)?)*$/)) {
$('#status').show();
} else {
$('#status').hide();
}
});
答案 3 :(得分:0)
如果输入字符串与\d\.\d+\.
匹配,则可以触发错误函数 - 这是一个数字后跟一个小数位,然后是一个或多个数字后跟另一个小数点。如果在第一个小数点后面有任何数字以外的数字(例如运算符),则不会触发错误。
答案 4 :(得分:0)
所以我添加了一个计数器:
dotCount = 0;
为button-dot
函数和操作数执行此操作:
$('#button-dot').click(function() {
var lastChar = $('#disp').val().slice(-1);
var firstChar = $('#disp').val().slice(0);
if (dotCount == 0){
if ($('#disp').hasClass("result")) {
$('#disp').removeClass("result").val("");
addChar(this.form.display,'0' + '.');
}
else if (lastChar == '.'){
// DO NOTHING
}
else if (lastChar == '1' || lastChar == '2' || lastChar == '3' || lastChar == '4' || lastChar == '5' || lastChar == '6' || lastChar == '7' || lastChar == '8' || lastChar == '9' || lastChar == '0' && firstChar != '0'){
addChar(this.form.display,'.');
}
else if (firstChar == '0'){
addChar(this.form.display,'0' + '.');
}
else {
addChar(this.form.display,'0' + '.');
}
}// END OF dotCount == 0
else if (dotCount == 1){
//DO NOTHING
}
$('#disp').removeClass("result");
dotCount = 1;
});
(以+
为例):
$('#button-plus').click(function() {
var lastChar = $('#disp').val().slice(-1);
var firstChar = $('#disp').val().slice(0);
if (lastChar == '*' || lastChar == '-' || lastChar == '+' || lastChar == '/' || lastChar == '.' || lastChar == '(' || lastChar == '%'){
// DO NOTHING
}
else if (firstChar == '0'){
// DO NOTHING
}
else {
addChar(this.form.display, '+');
}
$('#disp').removeClass("result");
dotCount = 0;
});
像魅力一样!谢谢,凯克里斯滕森的反制想法。