根据输入数据自动生成控制编号

时间:2018-07-21 09:55:30

标签: javascript

我只是一个使用javascript的初学者,我很难解决这个问题。我想根据名字和姓氏的第一个字符生成一个控制号。自动生成序列号和今年的后两位数字。

样品对照号:JS0001-18

JS =杰森·史密斯(条目名称)//姓氏和姓氏的第一个字符

0001 =序列号。

18 =今年的后两位数字。

此代码必须在我输入学生的名字之后自动出现...

非常感谢您,希望您能帮助我解决这个问题。

<script type="text/javascript">
  function getstudentNumber() {
    var lastnameFirstChar = $('#lastname').val().substr(0, 1);
    var firstnameFirstChar = $('#firstname').val().substr(0, 1);
    var studentID.value = lastname.value;
    var studentNumber = getSequence();
    document.getElementById("student_no").value = studentNumber;
    document.getElementById("student_no").focus();
    return true;
  }

  function getSequence(count, content) {
    var result = [];
    if (typeof content == "function") {
      for (var i = 0; i < count; i++) {
        result.push(content(i));
      }
    } else {
      for (var i = 0; i < count; i++) {
        result.push(content);
      }
    }
    return result;
  }

  function getYearNumber() {
    var d = new Date();
    var n = d.getFullYear().val().charAt(0);
    document.getElementById("demo").innerHTML = n;
  }
</script>

这是HTML代码

<div class="form-group">
  <label>Student Number</label>
  <input autofocus="" id="student_no" name="student_no" type="text" class="form-control" value="" onblur="getstudentNumber()"
  />
</div>
<div class="form-group">
  <label>Last Name</label>
  <input id="lastname" name="lastname" placeholder="" type="text" class="form-control" value="" />
</div>
<div class="form-group">
  <label>First Name</label>
  <input id="firstname" name="firstname" placeholder="" type="text" class="form-control" value="" />
</div>

1 个答案:

答案 0 :(得分:0)

提取姓名缩写

注意该答案假定元素“ student_no”用于 output ,并且JS应该使用全局变量来跟踪学生人数。

正如您所说,学生编号由三个块组成。名称,编号和年份。我们可以为每个函数创建一个函数。

function getInitials(firstName, lastName) {
  return (firstName[0] + lastName[0]).toUpperCase()
}

请注意,[0].substr(0, 1)相同。方括号的使用只会允许使用单个字符-但这就是我们在这种情况下需要的全部内容。

我们添加.toUpperCase()以确保即使您输入小写字母名称,您仍然可以得到大写字母的缩写。

获得短年

接下来,您的getYearNumber函数看起来有点破损。让我们从头开始写一个。它需要:

  • 生成一个新的日期对象
  • 提取年份

现在,我们可以立即将年份提取为两位数代码。但是,此方法已被弃用,因此我们需要自己做。

function getYear() {
  var now = new Date()
  var fullYear = now.getFullYear()
  var shortYear = fullYear % 100
}

% 100会在您除以100时找到余数。2018(写作年份)除以100会得到20余数 18 。完善!通过不将中间值存储在变量中,可以使函数更短。

function getYear() {
  return (new Date).getFullYear() % 100
}

注意:存在一个可怕的“ 2000年”问题。不过这对再千年都没关系;)

您对.val().charAt(0)的理论不太正确的原因是数字没有.val(),并且如果您想将其转换为字符串,.charAt(0)仅会给您第一个字符(在2中为2018)。希望有帮助吗?

零填充数字字符串

我们现在可以创建一个接受Number的函数(例如72);并创建带有填充零的字符串(例如0072

function paddedNumber(number) {
  var numberAsString = number.toString()
  var numberLength = numberAsString.length
  var numberLengthRemaining = 4 - numberLength
  var zeros = "0".repeat(numberLengthRemaining)
  return zeros + numberAsString
}

我们可以简化很多。

function paddedNumber(number) {
  return "0".repeat(4 - number.toString().length) + number
}

String + Number将始终为String

有一个问题。某些浏览器不支持现代的.repeat()。因此,我们将其替换为for循环。

function paddedNumber(number) {
  var result = ""
  for(var i = 4 - number.toString().length; i > 0; i--) {
    result += "0"
  }
  return result + number
}

很棒!

包装器功能

现在,我们将其与一个大功能整合在一起。

function makeStudentID(firstName, lastName, studentNumber) {
  return getInitials(firstName, lastName) + paddedNumber(studentNumber) + getYear()
}

数据收集和输出

最后,我们需要收集数据!

var sequenceNumber = 1
function gatherDataAndOutput() {
  var firstName = document.getElementById("firstname").value
  var lastName = document.getElementById("lastname").value
  var outputElement = document.getElementById("student_no")

  outputElement.value = makeStudentID(firstName, lastName, sequenceNumber)

  sequenceNumber++; // make a different ID for the next student.
}

在一起

JS代码看起来像这样(希望这将指向正确的方向)。

function getInitials(firstName, lastName) {
  return (firstName[0] + lastName[0]).toUpperCase()
}

function getYear() {
  return (new Date).getFullYear() % 100
}

function paddedNumber(number) {
  var result = ""
  for(var i = 4 - number.toString().length; i > 0; i--) {
    result += "0"
  }
  return result + number
}

function makeStudentID(firstName, lastName, studentNumber) {
  return getInitials(firstName, lastName) + paddedNumber(studentNumber) + getYear()
}

var sequenceNumber = 1
function gatherDataAndOutput() {
  var firstName = document.getElementById("firstname").value
  var lastName = document.getElementById("lastname").value
  var outputElement = document.getElementById("student_no")

  outputElement.value = makeStudentID(firstName, lastName, sequenceNumber)

  sequenceNumber++; // make a different ID for the next student.
}

HTML

我重新排序了HTML,添加了重命名的函数,并禁用了我们的输出输入,以便您不能键入它,只能从中查看和复制。这些只是样式更改(除了重命名功能之外)。请注意,当第二个输入模糊时-仅第一个输入模糊时,输出会更改。添加一个按钮可能会有所帮助,因为此刻,每当您模糊第二个输入时,ID都会更改,即使这是偶然的。

  <div class="form-group">
    <label>Last Name</label>
    <input id="lastname" name="lastname" placeholder="" type="text" class="form-control" />
  </div>
  <div class="form-group">
    <label>First Name</label>
    <input id="firstname" name="firstname" placeholder="" type="text" class="form-control" onblur="gatherDataAndOutput()"/>
  </div>
  <div class="form-group">
    <label>Student Number</label>
    <input autofocus="" id="student_no" name="student_no" type="text" class="form-control" disabled onblur="gatherDataAndOutput()"
    />
  </div>

实时

实时版本:https://MustySandyFolder--joker314.repl.co