You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

267 lines
10 KiB

/*
* Created with Sublime Text 3.
* license: http://www.lovewebgames.com/jsmodule/index.html
* github: https://github.com/tianxiangbing/format-number
* User: 田想兵
* Date: 2015-08-01
* Time: 11:27:55
* Contact: 55342775@qq.com
*/
;
(function (root, factory) {
//amd
if (typeof define === 'function' && define.amd) {
define(['$'], factory);
} else if (typeof exports === 'object') { //umd
module.exports = factory();
} else {
root.FormatNumber = factory(window.Zepto || window.jQuery || $);
}
})(this, function ($) {
$.fn.FormatNumber = function (settings) {
var arr = [];
$(this).each(function () {
var options = $.extend({
trigger: $(this)
}, settings);
var number = new FormatNumber();
number.init(options);
arr.push(number);
});
return arr;
};
var FormatNumber = function () { };
FormatNumber.prototype = {
init: function (settings) {
var _this = this,
minus = ''
settings = $.extend({
trigger: '[data-type="money"]',
decimal: 2,
minus: false, //是否支持负数,默认不支持
parent: 'body'
}, settings);
this.settings = settings;
var excludeKey = {
"left": 37,
"right": 39,
"top": 38,
"down": 40,
"home": 36,
"end": 35,
"shift": 16
};
var regex = '([1-9]\\d*(\\.\\d{1,2})?|0(\\.\\d{1,2})?)';
if (settings.decimal <= 0 && settings.minus == true) {
regex = '(^-?[1-9]\\d*$)|(^[0]$)'; //正负整数
} else if (settings.decimal == 0) {
regex = '(^[1-9]\\d*$)|(^[0]$)'; //正整数
} else if (settings.minus == true) {
//regex = '^-?([1-9]\\d*(\\.\\d{1,' + settings.decimal + '})?|([^0]{1}(\\.\\d{1,' + settings.decimal + '}))?)';
regex = '(^-)?((([1-9]d*(\\.\\d{1,' + settings.decimal + '})?)|((^[0]{1}\\.(\\d{1,' + settings.decimal + '})?$))|^[0]$))'
} else {
regex = '([1-9]\\d*(\\.\\d{1,' + settings.decimal + '})?|([^0]{1}(\\.\\d{1,' + settings.decimal + '}))?)';
}
parent = parent || 'body';
$(settings.trigger, parent).each(function (i, v) {
var txt, formatTxt;
if ($(v)[0].tagName == 'INPUT') {
txt = $(v).val();
if ($(v).attr('data-name')) {
var name = $(v).attr('data-name'),
id = name.split('.')[1] || name.split('.')[0];
$(v).parent().append('<input data-rule="number" id="' + id + '" type="hidden" />');
$('#' + id).val(_this.getMoneyfloat($(v).val()));
}
formatTxt = _this.doFormat(txt);
$(v).val(formatTxt);
$(this).attr('data-value', _this.getMoneyfloat($(v).val()));
} else {
txt = $(v).text();
formatTxt = _this.doFormat(txt);
$(v).attr('data-value', txt).text(formatTxt);
}
});
$(settings.trigger, parent).on('keyup keydown', function (e) {
var that = this, _e = e;
setTimeout(function () {
if (_e.keyCode === 9) { return false; }//當是tab鍵時不做動作
checkNumber.call(that, _e);
}, 10);//全選時直接key入取代
});
// $(settings.trigger, parent).on('blur', function(e) {
// checkNumber.call(this, e)
// });
function checkNumber(e) {
var name = $(this).attr('data-name'),
id = name.split('.')[1] || name.split('.')[0];
GetNumberResult(e, $(this)[0], regex);
var v = _this.getMoneyfloat($(this).val());
$('#' + id).val(v);
$(this).attr('data-value', v);
}
function GetNumberResult(e, obj, reg) {
var valueLength = obj.value.length;
var position = getTxtCursorPosition(obj);
var key = window.event ? e.keyCode : e.which;
if ('17,65'.indexOf(key) > -1) {
return;
}
var result = convertNumberN(key, obj.value, reg);
obj.value = result;
if ('8,46'.indexOf(key) > -1) {
setTimeout(function () {
position += (result.length - valueLength);
setTxtCursorPosition(obj, position);
}, 10);
}
else {
position += (result.length - valueLength);
setTxtCursorPosition(obj, position);
}
}
/**
* 说明: 检查不做处理的键盘Key
* 参数: 键盘KeyCode {String}
* 返回值: 如果是不做处理的key返回true,反之false {bool}
*/
function checkInactionKey(keyCode) {
for (var key in excludeKey) {
if (keyCode == excludeKey[key]) {
return true;
}
}
return false;
}
/**
* 说明: 获取文本框的光标位置
* 参数: 文本框对象 {dom object}
* 返回值: {int}
*/
function getTxtCursorPosition(txtObj) {
var tempObj = txtObj;
var cursurPosition = -1;
if (tempObj.selectionStart != undefined) { //非IE浏览器
cursurPosition = tempObj.selectionStart;
} else { //IE
var range = document.selection.createRange();
range.moveStart("character", -tempObj.value.length);
cursurPosition = range.text.length;
}
return cursurPosition;
}
/**
* 说明: 转换数字为千分位,常用于财务系统
* 参数: 键盘key {String},被处理的字符串 {String}
* 返回值: 返回转换的结果 {String}
*/
function convertNumberN(key, value, reg) {
if (checkInactionKey(key)) {
return value;
}
var tempValue = value;
var isminus = false;
var replaceReg = /[^\d\.]/g;
if (settings.minus && /^\-/.test(tempValue)) {
tempValue = tempValue.slice(1);
isminus = true;
}
if (tempValue.indexOf(".") <= 0) {
//replaceReg = /[^\d]/g;
tempValue = tempValue.replace(replaceReg, "");
} else {
tempValue = tempValue.replace(replaceReg, "");
var isNaNNum = parseFloat(tempValue + "00");
if (isNaN(isNaNNum)) {
tempValue = isNaNNum;
}
if (/\./.test(tempValue) && settings.decimal == 0) {
tempValue = tempValue.toString().replace(/\./g, '');
}
}
var re = new RegExp(reg);
if (!re.exec(tempValue) && tempValue != "") {
tempValue = "0";
}
var tempValueArray = tempValue.split(".");
tempValue = tempValueArray.length > 1 ?
(tempValueArray[0].length > 14 ? tempValueArray[0].substr(0, 14) : tempValueArray[0]) + "." + tempValueArray[1] :
(tempValue.length > 14 ? tempValue.substr(0, 14) : tempValue);
var result = _this.doFormat(tempValue);
if (isminus) result = '-' + result;
if (result == null) {
return;
}
var resultArray = result.split(".");
if (tempValue.lastIndexOf(".") >= 0) {
if (tempValue.lastIndexOf(".") == tempValue.length - 1) {
tempValue = resultArray[0] + '.';
} else {
var subLength = tempValue.length - (tempValue.lastIndexOf(".") + 1);
tempValue = resultArray[0] + "." + (resultArray[1] ? resultArray[1].substring(0, subLength) : '0');
}
} else {
tempValue = resultArray[0];
}
return tempValue;
}
/**
* 说明: 设置文本框的光标位置
* 参数: 文本框对象 {dom object}, 光标的位置 {int}
* 返回值: {void}
*/
function setTxtCursorPosition(txtObj, pos) {
var tempObj = txtObj;
var cursurPosition = -1;
if (tempObj.selectionStart != undefined) { //非IE浏览器
tempObj.setSelectionRange(pos, pos);
} else { //IE
var range = tempObj.createTextRange();
range.move("character", pos);
range.select();
}
}
},
getMoneyfloat: function (s) {
if (s == '') {
return null;
}
return parseFloat((s + "").replace(/[^\d\.-]/g, ""));
},
doFormat: function (s) {
var _this = this;
if (!s) return "";
if ($.isNumeric(s)) {
s = s.toString();
}
if (typeof s === 'string') {
s = s.replace(/^(\d+)((\.\d*)?)$/, function (v1, v2, v3) {
var sInteger = v2.replace(/\d{1,3}(?=(\d{3})+$)/g, '$&,'),
sDecimal = (v3 || '.00000000000').slice(0, _this.settings.decimal + 1);
return _this.settings.decimal === 0 ? sInteger : sInteger + sDecimal;
});
}
return s.replace(/^\./, "0.")
}
};
return FormatNumber;
});