银行 金额js设置 (增加千位符及保留两位小数, 阿拉伯数字转为繁体, 等等)

window.fn = window.fn || {};
fn.jQuery = fn.jQuery || window.jQuery;

(function ($) {
  // 检查是否已经加载过了
  if (window["fn.money.js"]) {
    return;
  } else {
    window["fn.money.js"] = true;
    fn.money = {};
  }

  var add, sub, mul, div, toChinese, toDigit, toNumber;
  // 把货币转换成数字
  // {string} obj 要转换的字符串
  fn.money.toNumber = toNumber = function (obj) {
    if (typeof obj === "number") {
      return obj;
    } else if (typeof obj === "string") {
      obj = obj.replace(/,/g, "");
      obj = obj.replace(/¥/g, "");
      if (!obj) {
        return 0;
      } else if (isNaN(obj)) {
        return 0;
      }
      return parseFloat(obj);
    } else {
      return 0;
    }
  };

  // 加法函数,用来得到精确的加法结果
  fn.money.add = add = function () {
    function doAdd(arg1, arg2) {
      arg1 = toNumber(arg1);
      arg2 = toNumber(arg2);

      var r1, r2, m;
      try {
        r1 = arg1.toString().split(".")[1].length;
      } catch (e) {
        r1 = 0;
      }
      try {
        r2 = arg2.toString().split(".")[1].length;
      } catch (e) {
        r2 = 0;
      }
      m = Math.pow(10, Math.max(r1, r2));

      return (Math.round(arg1 * m) + Math.round(arg2 * m)) / m;
    }
    var args = arguments;
    var sum = args[0] || 0;
    for (var i = 1; i < args.length; i++) {
      sum = doAdd(sum, args[i]);
    }
    return sum;
  };

  // 减法函数,用来得到精确的加法结果
  fn.money.sub = sub = function () {
    function doSub(arg1, arg2) {
      arg1 = toNumber(arg1);
      arg2 = toNumber(arg2) * -1;
      var r1, r2, m;
      try {
        r1 = arg1.toString().split(".")[1].length;
      } catch (e) {
        r1 = 0;
      }
      try {
        r2 = arg2.toString().split(".")[1].length;
      } catch (e) {
        r2 = 0;
      }
      m = Math.pow(10, Math.max(r1, r2));

      return (Math.round(arg1 * m) + Math.round(arg2 * m)) / m;
    }
    var args = arguments;
    var sum = args[0] || 0;
    for (var i = 1; i < args.length; i++) {
      sum = doSub(sum, args[i]);
    }
    return sum;
  };

  // 乘法函数,用来得到精确的乘法结果
  fn.money.mul = mul = function () {
    function doMul(arg1, arg2) {
      arg1 = toNumber(arg1);
      arg2 = toNumber(arg2);
      var m = 0,
        s1 = arg1.toString(),
        s2 = arg2.toString();
      try {
        m += s1.split(".")[1].length;
      } catch (e) { }
      try {
        m += s2.split(".")[1].length;
      } catch (e) { }
      return (
        (Number(s1.replace(".", "")) * Number(s2.replace(".", ""))) /
        Math.pow(10, m)
      );
    }
    var args = arguments;
    var sum = args[0] || 0;
    for (var i = 1; i < args.length; i++) {
      sum = doMul(sum, args[i]);
    }
    return sum;
  };

  // 除法函数,用来得到精确的除法结果
  fn.money.div = div = function (arg1, arg2) {
    function doDiv(arg1, arg2) {
      arg1 = toNumber(arg1);
      arg2 = toNumber(arg2);
      var t1 = 0,
        t2 = 0,
        r1,
        r2;
      try {
        t1 = arg1.toString().split(".")[1].length;
      } catch (e) { }
      try {
        t2 = arg2.toString().split(".")[1].length;
      } catch (e) { }
      with (Math) {
        r1 = Number(arg1.toString().replace(".", ""));
        r2 = Number(arg2.toString().replace(".", ""));
        return (r1 / r2) * pow(10, t2 - t1);
      }
    }
    var args = arguments;
    var sum = args[0] || 0;
    for (var i = 1; i < args.length; i++) {
      sum = doDiv(sum, args[i]);
    }
    return sum;
  };

  // 将数值转换为中文金额(可以处理整数, 小数, 负数)
  fn.money.toChinese = toChinese = function (n) {
    n = toNumber(n);
    var fraction = ["角", "分"];
    var digit = ["零", "壹", "貳", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
    var unit = [["元", "万", "亿", "万亿"], ["", "拾", "佰", "仟"]];
    var head = n < 0 ? "欠" : "";
    n = Math.abs(n);
    var s = "";
    for (var i = 0; i < fraction.length; i++) {
      s += (
        digit[Math.floor(mul(mul(n, 10), Math.pow(10, i))) % 10] + fraction[i]
      ).replace(/零./, "");
    }
    s = s || "整";
    n = Math.floor(n);
    for (var i = 0; i < unit[0].length && n > 0; i++) {
      var p = "";
      for (var j = 0; j < unit[1].length && n > 0; j++) {
        p = digit[n % 10] + unit[1][j] + p;
        n = Math.floor(n / 10);
      }
      s = p.replace(/(零.)*零$/, "").replace(/^$/, "零") + unit[0][i] + s;
    }
    s =
      head +
      s
        .replace(/(零.)*零元/, "元")
        .replace(/(零.)+/g, "零")
        .replace(/^整$/, "零元整");
    if (s.replace("万亿", "").indexOf("亿") > -1) {
      s = s.replace("万亿", "万");
    }
    return s;
  };

  // 将中文金额转换成数值(可以处理中文金额 或 阿拉伯数字字符串)
  fn.money.toDigit = toDigit = function (n) {
    // Number
    if (typeof n == "number") return n;
    if (typeof n != "string") return null;
    //string
    if (!isNaN(n)) return parseFloat(n);
    // chinese
    var digit = ["零", "壹", "貳", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
    var unit = ["万", "亿", "拾", "佰", "仟"];
    var fraction = ["角", "分", "整"];
    var head = n.charAt(0) == "欠" ? -1 : 1;
    n = n.substr(1);

    var ary = n.split("元"),
      _int = arr[0],
      _dec = ary.length > 1 ? arr[1] : "";
    // 去除单位
    for (var i = 0; i < unit.length; i++) {
      _int = replace(_int, unit[i], "");
    }
    for (var i = 0; i < fraction.length; i++) {
      _dec = replace(_dec, fraction[i], "");
    }

    // 替换数字
    for (var i = 0; i < digit.length; i++) {
      _int = replace(_int, digit[i], i);
      _dec = replace(_dec, digit[i], i);
    }

    function replace(text, s1, s2) {
      return text.replace(new RegExp(s1, "gm"), s2);
    }
    return head * parseFloat(_int + "." + _dec);
  };

  // 格式化金额
  fn.money.format = function (num, opt) {
    num = toNumber(num);
    opt = $.extend(
      {
        separator: ",",
        scale: 2
      },
      opt
    );
    var re = /(\d{1,3})(?=(\d{3})+(?:$|\.))/g,
      scale = Math.pow(10, opt.scale);
    num = fn.money.add(num, 0);
    num = Math.round(num * scale) / scale;
    num = num.toString().replace(re, "$1" + opt.separator);

    // 如果小数位大于0
    if (opt.scale > 0) {
      num = num.split(".");

      if (num.length === 1) {
        num.push("");
      }
      // 去除小数内的分隔符
      num[1] = num[1].replace(/,/g, "");
      // 补足小数位
      while (num[1].length < opt.scale) {
        num[1] += "0";
      }
      num = num.join(".");
    }
    return num;
  };

  // Luhm校验规则: 16位银行卡号 (19位通用):
  // 1.将末带校验位的 15(或18) 位卡号从右依次编号 1 到 15 (18), 位于奇数位号上的数字乘以2
  // 2.将奇位乘积的个十位全部相加,再加上所有偶数位上的数字
  // 3.将加法和加上校验位能被10整除
  fn.money.bankcard = function (bankNum) {
    var regExp = /^\d+$/;
    if (bankNum.length == 0 || bankNum == null) {
      return false;
    } else if (regExp.test(bankNum) == false) {
      return false;
    } else {
      var lastNum = bankNum.substr(bankNum.length - 1, 1),
        firstNum = bankNum.substr(0, bankNum.length - 1),
        array = firstNum.split(""),
        luhmSum = 0;
      for (var i = array.length - 1, j = 0; i >= 0; i-- , j++) {
        var k = parseInt(array[i]);
        if (j % 2 == 0) {
          k = k * 2;
          if (k > 10) k = 1 + (k % 10);
          else if (k == 10) k = 1;
        }
        luhmSum += k;
      }
      var luhmNum =
        parseInt(luhmSum) % 10 == 0
          ? 0
          : parseInt(10 - (parseInt(luhmSum) % 10));
      if (lastNum != String(luhmNum)) {
        return false;
      }
    }
    return true;
  };
  // 判断字符串是否是身份证号
  fn.money.idcard = function (idCard) {
    var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1]; //加权因子
    var ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2]; //身份证验证位值 10代表X
    var sum = 0;
    var isValidityBrith = function (year, month, day) {
      var temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
      if (year.length == 2) {
        var temp_year = temp_date.getYear();
      } else if (year.length == 4) {
        var temp_year = temp_date.getFullYear();
      } else {
        return false;
      }
      if (
        temp_year != parseFloat(year) ||
        temp_date.getMonth() != parseFloat(month) - 1 ||
        temp_date.getDate() != parseFloat(day)
      ) {
        return false;
      } else {
        return true;
      }
    };

    idCard = idCard.replace(/ /g, "").replace(/(^\s*)|(\s*$)/g, "");
    if (idCard.length == 15) {
      var year = idCard.substring(6, 8),
        month = idCard.substring(8, 10),
        day = idCard.substring(10, 12);
      return isValidityBrith(year, month, day);
    }
    if (idCard.length != 18) return false;
    var a_idCard = idCard.split("");
    if (a_idCard[17].toLowerCase() == "x") a_idCard[17] = 10;
    for (var i = 0; i < 17; i++) {
      sum += Wi[i] * a_idCard[i];
    }
    valCodePosition = sum % 11; //得到验证码所在位置
    if (a_idCard[17] != ValideCode[valCodePosition]) return false;

    var year = idCard.substring(6, 10),
      month = idCard.substring(10, 12),
      day = idCard.substring(12, 14);
    return isValidityBrith(year, month, day);
  };
})(fn.jQuery);

posted on 2019-07-02 09:51  ㅤㅤㅤㅤㅤㅤ  阅读(291)  评论(0编辑  收藏  举报

导航