|
|
/*
|
|
|
* 参数说明:
|
|
|
* number:要格式化的数字
|
|
|
* decimals:保留几位小数
|
|
|
* roundtag:舍入参数,默认 ‘ceil‘ 向上取,‘floor‘向下取,‘round‘ 四舍五入
|
|
|
* */
|
|
|
function numberFormat(obj, decimals) {
|
|
|
var number = obj.value;
|
|
|
number = (number + "").replace(/[^0-9+-Ee.]/g, "");
|
|
|
number = number.replace(/,/g, "");
|
|
|
var roundtag = "round"; // 四舍五入
|
|
|
var n = !isFinite(+number) ? 0 : +number;
|
|
|
var prec = !isFinite(+decimals) ? 0 : Math.abs(decimals);
|
|
|
var sep = ","; //千分位符号
|
|
|
var dec = "."; //小数点符号
|
|
|
var s = "";
|
|
|
var toFixedFix = function (n, prec) {
|
|
|
var k = Math.pow(10, prec);
|
|
|
console.log();
|
|
|
|
|
|
return "" + parseFloat(Math[roundtag](parseFloat((n * k).toFixed(prec * 2))).toFixed(prec * 2)) / k
|
|
|
}
|
|
|
s = (prec ? toFixedFix(n, prec) : "" + Math.round(n)).split(".");
|
|
|
var re = /(-?\d+)(\d{3})/;
|
|
|
while (re.test(s[0])) {
|
|
|
s[0] = s[0].replace(re, "$1" + sep + "$2");
|
|
|
}
|
|
|
|
|
|
if ((s[1] || "").length < prec) {
|
|
|
s[1] = s[1] || "";
|
|
|
s[1] += new Array(prec - s[1].length + 1).join("0");
|
|
|
}
|
|
|
|
|
|
obj.value = s.join(dec);//给原input框重新赋值
|
|
|
}
|
|
|
|
|
|
|
|
|
function endWith(str, s) {
|
|
|
if (s == null || s == "" || str.length == 0 || s.length > str.length)
|
|
|
return false;
|
|
|
if (str.substring(str.length - s.length) == s)
|
|
|
return true;
|
|
|
else
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
function startWith(str, s) {
|
|
|
if (s == null || s == "" || str.length == 0 || s.length > str.length)
|
|
|
return false;
|
|
|
if (str.substr(0, s.length) == s)
|
|
|
return true;
|
|
|
else
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
function replaceAll(s1, s2, s3) {
|
|
|
return s1.replace(new RegExp(s2, 'gm'), s3);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* AtPara=@key1=value1@key2=valu2...@keyN=valueN
|
|
|
*/
|
|
|
function GetAtPara(atPara, key) {
|
|
|
if (typeof atPara != "string" || typeof key == "undefined" || key == "") {
|
|
|
return undefined;
|
|
|
}
|
|
|
var reg = new RegExp("(^|@)" + key + "=([^@]*)(@|$)");
|
|
|
var results = atPara.match(reg);
|
|
|
if (results != null) {
|
|
|
return unescape(results[2]);
|
|
|
}
|
|
|
return undefined;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 输入验证firfox, ff浏览器不支持execCommand()
|
|
|
*/
|
|
|
function isFF() {
|
|
|
return navigator.userAgent.indexOf("Firefox") > 0;
|
|
|
}
|
|
|
function valitationBefore(o, validateType) {
|
|
|
if (isFF()) {
|
|
|
var value = o.value;
|
|
|
var flag = false;
|
|
|
switch (validateType) {
|
|
|
case "int" :
|
|
|
flag = (!isNaN(value) && value % 1 === 0);
|
|
|
break;
|
|
|
case "float" :
|
|
|
case "money":
|
|
|
if (value.indexOf("-")===0 && value.length===1)
|
|
|
break;
|
|
|
flag = !isNaN(value);
|
|
|
break;
|
|
|
}
|
|
|
if (flag)
|
|
|
return;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var idx = 0;
|
|
|
var oldCount = 0;
|
|
|
function valitationAfter(o, validateType) {
|
|
|
idx = getCursortPosition(o);
|
|
|
oldCount = getStrCount(o.value.toString().substr(0, idx), ',');
|
|
|
var value = o.value;
|
|
|
|
|
|
if (isFF()) {
|
|
|
var flag = false;
|
|
|
switch (validateType) {
|
|
|
case "int":
|
|
|
flag = (!isNaN(value) && value % 1 === 0);
|
|
|
break;
|
|
|
case "float":
|
|
|
case "money":
|
|
|
if (value.indexOf("-") == 0 && value.length == 1)
|
|
|
break;
|
|
|
else {
|
|
|
flag = !isNaN(value);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
if (!flag) {
|
|
|
o.value = '';
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function addplaceholder(obj, bit) {
|
|
|
if (obj.value == "") {
|
|
|
|
|
|
switch (bit) {
|
|
|
case 0:
|
|
|
obj.value = '0';
|
|
|
break;
|
|
|
default:
|
|
|
obj.value = '0.00';
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 输入验证firfox, ff浏览器不支持execCommand()
|
|
|
*/
|
|
|
|
|
|
function limitLength(obj, length) {
|
|
|
obj.value = obj.value.replace(/[^\d,.-]/g, ""); //清除“数字”和“.”以外的字符 ;
|
|
|
if (length != null && length != "" && length != "undefined") {
|
|
|
if (obj.value.indexOf('.')>=0 && obj.value.split('.')[1].length > length) {
|
|
|
obj.value = obj.value.substring(0, obj.value.length - 1);
|
|
|
//obj.focus();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//类型为Money时输入设置
|
|
|
function clearNoNum(obj){
|
|
|
//修复第一个字符是小数点 的情况.
|
|
|
if(obj.value !=''&& obj.value.substr(0,1) == '.'){
|
|
|
obj.value=0+obj.value;
|
|
|
}
|
|
|
if (obj.value == "")
|
|
|
obj.value = 0.00;
|
|
|
|
|
|
if (!/\./.test(obj.value)) //为整数字符串在末尾添加.00
|
|
|
obj.value += '.00';
|
|
|
|
|
|
obj.value = obj.value.replace(/^0*(0\.|[1-9])/, '$1');//解决 粘贴不生效
|
|
|
obj.value = obj.value.replace(/[^\d.]/g,""); //清除“数字”和“.”以外的字符
|
|
|
obj.value = obj.value.replace(/\.{2,}/g,"."); //只保留第一个. 清除多余的
|
|
|
obj.value = obj.value.replace(".","$#$").replace(/\./g,"").replace("$#$",".");
|
|
|
obj.value = obj.value.replace(/^(-)*(\d+)\.(\d\d).*$/,'$1$2.$3');//只能输入两个小数
|
|
|
if(obj.value.indexOf(".")< 0 && obj.value !=""){//以上已经过滤,此处控制的是如果没有小数点,首位不能为类似于 01、02的金额
|
|
|
if(obj.value.substr(0,1) == '0' && obj.value.length == 2){
|
|
|
obj.value= obj.value.substr(1,obj.value.length);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//设置光标位置
|
|
|
function setCaretPosition(ctrl, pos) {
|
|
|
if (ctrl.setSelectionRange) {
|
|
|
ctrl.focus();
|
|
|
ctrl.setSelectionRange(pos, pos);
|
|
|
}
|
|
|
else if (ctrl.createTextRange) {
|
|
|
var range = ctrl.createTextRange();
|
|
|
range.collapse(false);
|
|
|
range.moveEnd('character', pos);
|
|
|
range.moveStart('character', pos);
|
|
|
range.select();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 获取光标位置
|
|
|
function getCursortPosition(ctrl) {
|
|
|
var CaretPos = 0; // IE Support
|
|
|
if (document.selection) {
|
|
|
ctrl.focus();
|
|
|
var Sel = document.selection.createRange();
|
|
|
Sel.moveStart('character', -ctrl.value.length);
|
|
|
CaretPos = Sel.text.length;
|
|
|
}
|
|
|
// Firefox support
|
|
|
else if (ctrl.selectionStart || ctrl.selectionStart == '0')
|
|
|
CaretPos = ctrl.selectionStart;
|
|
|
return (CaretPos);
|
|
|
}
|
|
|
|
|
|
function FormatMoney(obj, precision, separator) {
|
|
|
//获取之前的,
|
|
|
var oldV = obj.value;
|
|
|
|
|
|
if (precision == undefined || precision == null || precision == "")
|
|
|
precision = 2;
|
|
|
if (precision != 2)
|
|
|
return;
|
|
|
oldV = oldV.replace(/[^\d.-]/g, "");
|
|
|
var val = formatNumber(oldV, precision, separator);
|
|
|
if (isNaN(val)==false )
|
|
|
obj.value = val;
|
|
|
var didx = getStrCount(val.toString().substr(0, idx),',');
|
|
|
if (didx > oldCount && didx > 0)
|
|
|
idx = idx +1;
|
|
|
setCaretPosition(obj,idx);
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
//统计字符串中特定字符串的个数
|
|
|
function getStrCount(scrstr,armstr){
|
|
|
//scrstr 源字符串 armstr 特殊字符
|
|
|
var count=0;
|
|
|
while(scrstr.indexOf(armstr) >=1 )
|
|
|
{
|
|
|
scrstr = scrstr.replace(armstr,"");
|
|
|
count++;
|
|
|
}
|
|
|
|
|
|
return count;
|
|
|
}
|
|
|
/**
|
|
|
* 将数值格式化成金额形式
|
|
|
*
|
|
|
* @param num 数值(Number或者String)
|
|
|
* @param precision 精度,默认不变
|
|
|
* @param separator 分隔符,默认为逗号
|
|
|
* @return 金额格式的字符串,如'1,234,567',默认返回NaN
|
|
|
* @type String
|
|
|
*/
|
|
|
function formatNumber(num, precision, separator) {
|
|
|
if (precision != 2)
|
|
|
return num;
|
|
|
var parts;
|
|
|
// 判断是否为数字
|
|
|
if (!isNaN(parseFloat(num)) && isFinite(num)) {
|
|
|
// 把类似 .5, 5. 之类的数据转化成0.5, 5, 为数据精度处理做准, 至于为什么
|
|
|
// 不在判断中直接写 if (!isNaN(num = parseFloat(num)) && isFinite(num))
|
|
|
// 是因为parseFloat有一个奇怪的精度问题, 比如 parseFloat(12312312.1234567119)
|
|
|
// 的值变成了 12312312.123456713
|
|
|
num = Number(num);
|
|
|
// 处理小数点位数
|
|
|
num = (typeof precision !== 'undefined' ? (Math.round(num * Math.pow(10, precision)) / Math.pow(10, precision)).toFixed(precision) : num).toString();
|
|
|
// 分离数字的小数部分和整数部分
|
|
|
parts = num.split('.');
|
|
|
// 整数部分加[separator]分隔, 借用一个著名的正则表达式
|
|
|
parts[0] = parts[0].toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + (separator || ','));
|
|
|
|
|
|
return parts.join('.');
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
/* 文本框根据输入内容自适应高度
|
|
|
* @param {HTMLElement} 输入框元素
|
|
|
* @param {Number} 设置光标与输入框保持的距离(默认0)
|
|
|
* @param {Number} 设置最大高度(可选)
|
|
|
*/
|
|
|
var autoTextarea = function (elem, extra, maxHeight) {
|
|
|
extra = extra || 0;
|
|
|
var isFirefox = !!document.getBoxObjectFor || 'mozInnerScreenX' in window,
|
|
|
isOpera = !!window.opera && !!window.opera.toString().indexOf('Opera'),
|
|
|
addEvent = function (type, callback) {
|
|
|
elem.addEventListener ?
|
|
|
elem.addEventListener(type, callback, false) :
|
|
|
elem.attachEvent('on' + type, callback);
|
|
|
},
|
|
|
getStyle = elem.currentStyle ? function (name) {
|
|
|
var val = elem.currentStyle[name];
|
|
|
|
|
|
if (name === 'height' && val.search(/px/i) !== 1) {
|
|
|
var rect = elem.getBoundingClientRect();
|
|
|
return rect.bottom - rect.top -
|
|
|
parseFloat(getStyle('paddingTop')) -
|
|
|
parseFloat(getStyle('paddingBottom')) + 'px';
|
|
|
}
|
|
|
|
|
|
return val;
|
|
|
} : function (name) {
|
|
|
return getComputedStyle(elem, null)[name];
|
|
|
},
|
|
|
minHeight = parseFloat(getStyle('height'));
|
|
|
|
|
|
elem.style.resize = 'none';
|
|
|
|
|
|
var change = function () {
|
|
|
var scrollTop, height,
|
|
|
padding = 0,
|
|
|
style = elem.style;
|
|
|
|
|
|
if (elem._length === elem.value.length) return;
|
|
|
elem._length = elem.value.length;
|
|
|
|
|
|
if (!isFirefox && !isOpera) {
|
|
|
padding = parseInt(getStyle('paddingTop')) + parseInt(getStyle('paddingBottom'));
|
|
|
}
|
|
|
scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
|
|
|
|
|
|
elem.style.height = minHeight + 'px';
|
|
|
if (elem.scrollHeight > minHeight) {
|
|
|
if (maxHeight && elem.scrollHeight > maxHeight) {
|
|
|
height = maxHeight - padding+10;
|
|
|
style.overflowY = 'auto';
|
|
|
} else {
|
|
|
height = elem.scrollHeight - padding+10;
|
|
|
style.overflowY = 'hidden';
|
|
|
}
|
|
|
style.height = height + extra + 'px';
|
|
|
scrollTop += parseInt(style.height) - elem.currHeight;
|
|
|
document.body.scrollTop = scrollTop;
|
|
|
document.documentElement.scrollTop = scrollTop;
|
|
|
elem.currHeight = parseInt(style.height);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
addEvent('propertychange', change);
|
|
|
addEvent('input', change);
|
|
|
addEvent('focus', change);
|
|
|
change();
|
|
|
};
|
|
|
|
|
|
export{
|
|
|
numberFormat,
|
|
|
endWith,
|
|
|
startWith,
|
|
|
replaceAll,
|
|
|
GetAtPara,
|
|
|
valitationBefore,
|
|
|
valitationAfter,
|
|
|
addplaceholder,
|
|
|
clearNoNum,
|
|
|
FormatMoney,
|
|
|
limitLength,
|
|
|
autoTextarea,
|
|
|
formatNumber
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|