以下Function可以用于textbox的KeyUp事件:

2014-06-06 发现旧版IE不支持selectionStart还有字符串的"[]"索引获取值, 已经修复这个bug.

2014-06-10 修复上一次修复遗留的IE的bug.

/*
Validate the textbox value is decimal.
*/ var numberChars = "1234567890"; function isDecimal(item) {
var obj = $(item);
if (obj.length > 0) {
if ($(obj).val() != null && typeof ($(obj).val()) != 'undefined') { var str = $(obj).val().toString();
if (str != "") {
//记录初始光标位置
var selectionStart = item.selectionStart;
//兼容IE
if (typeof (item.createTextRange) != "undefined") {
item.focus();
var r = document.selection.createRange(), tr = item.createTextRange();
tr.setEndPoint('endtoend', r);
item.selectionStart = tr.text.length - r.text.length;
item.selectionEnd = tr.text.length;
selectionStart = item.selectionStart;
}
//用于判断千位符的数量变化
var pren = str.split(',').length - 1;
//合法Decimal格式字符串, 可以含千位符(,号)
var pattern = '^-?0(\\.\\d+)?$|^-?[1-9]\\d*(\\.\\d+)?$|^-?([1-9][0-9]{0,2},)(\\d{3},)*(\\d{3})(\\.\\d+)?$';
//合法字符集, 不包括,号
var pattern2 = '^[0-9\.-]*$'; var reg = new RegExp(pattern, 'g');
var reg2 = new RegExp(pattern2, 'g'); //转换之前, 去除,号
var temp = str.replace(/,/, "");
while (temp.indexOf(',') >= 0) {
temp = temp.replace(/,/, "");
}
var nstr = '';
if (reg2.test(temp)) {
//除(/)数和模(%)数
var k1 = 0, k2 = 0;
//转换开始和结束位置
var start = 0, end = 0;
//千位符(,号)
var pp = ',';
//计数(3的倍数)
var p = 0;
//判断前置的非数字符号(这里是-号)
for (; start < temp.length; start++) {
if (numberChars.indexOf(temp.substring(start, start + 1)) >= 0) {
break;
}
nstr = nstr.concat(temp.substring(start, start + 1));
}
//小数符号(.号)的位置
var pIndex = temp.indexOf('.');
//存在小数符(.号), 即以它的位置为结束位置, 否则以字符串结尾为结束位置
if (pIndex >= 0) {
end = pIndex;
} else {
end = temp.length;
}
k2 = (end - start) % 3;
k1 = parseInt((end - start) / 3); for (var i = 0; i < k2; i++) {
nstr = nstr.concat(temp.substring(start + i, start + i + 1));
}
if (k1 > 0 && k2 > 0) {
nstr = nstr.concat(pp);
}
for (var i = k2 + start; i < end; i++) {
nstr = nstr.concat(temp.substring(i, i + 1));
p++;
if (p == 3 && i + 1 != end) {
p = 0;
nstr = nstr.concat(pp);
}
}
for (var i = end; i < temp.length; i++) {
nstr = nstr.concat(temp.substring(i, i + 1));
}
} else {
nstr = str;
}
if (!reg.test(nstr)) {
//去除不合法符号(包括手动输入的,号)
if (nstr.match(/[^0-9,\.-]/g) != null) {
var matchLength = nstr.match(/[^0-9,\.-]/g).length;
if (matchLength > 0) {
var tempLength = nstr.length;
nstr = nstr.replace(/[^0-9,\.-]/g, '');
$(item).val(nstr);
selectionStart = selectionStart - tempLength + nstr.length;
}
}
}
$(item).val(nstr);
if (str != nstr) {
var tpren = nstr.split(',').length - 1;
if (pren != tpren) { //根据千位符的数量变化, 控制光标位置
item.selectionStart = selectionStart + tpren - pren;
item.selectionEnd = selectionStart + tpren - pren;
} else {
item.selectionStart = selectionStart;
item.selectionEnd = selectionStart;
}
}
//兼容IE
if (typeof (item.createTextRange) != "undefined") {
var range = item.createTextRange();
range.collapse(true);
range.moveEnd('character', item.selectionEnd);
range.moveStart('character', item.selectionStart);
range.select();
}
return true;
}
}
}
return false;
}

对Textbox的值转换为带千位符和小数的Decimal字符串的更多相关文章

  1. js实现千位符分隔

    前几天面试做保险项目的公司,被问到了一道实现千位符分割方法的题,乍一看挺简单,但做起来最后却没给出来一个合适的解决方法.回来自己琢磨了一个还行的答案. var num = 3899000001, ar ...

  2. js千位符 | js 千位分隔符 | js 金额格式化

    js 千位分隔符 千位分隔符,其实就是数字中的逗号.依西方的习惯,人们在数字中加进一个符号,以免因数字位数太多而难以看出它的值.所以人们在数字中,每隔三位数加进一个逗号,也就是千位分隔符,以便更加容易 ...

  3. wpf 千位符 格式化字符串

    StringFormat={}{0:N2}}//格式话字符串,增加千位符,2保留小数点后2位 StringFormat={}{0:N0}}//格式话字符串,增加千位符,无小数点后

  4. js-格式化数字保留两位小数-带千分符

    很多时候发现有时候js会提示自带函数不能使用,所以自己找了很多资料实现了个 html <input type="text" class="input_text in ...

  5. JS实现数字千位符格式化方法

    /** * [number_format 参数说明:] * @param {[type]} number [number:要格式化的数字] * @param {[type]} decimals [de ...

  6. MySQL中大数字加减,不产生千位符和科学计数

    mysql数字加减科学计数法 这两天因为需求,需要获取一张表的流水号.规则是这样的.当前日期+8位流水号.比如:2015062400000001,2015062400000002,2015062400 ...

  7. vue 自定义千位符过滤器

    在main.js页面全局引入 Vue.filter('formatNum', function(value) { if(!value) return '' let num = value.toStri ...

  8. JS给数字加千位分隔符

    本文原链接:https://www.jianshu.com/p/928c68f92c0c JavaScript实现千位分隔符 将普通的数字转换为带千位分隔符格式的数字字符串是一个非常常见的问题,千位分 ...

  9. javascript中将整数添加千位符号

    如果num是整数的话,将其转换成带千位符号的字符串: Number(num).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' +  ','); 另 ...

随机推荐

  1. form表单提交校验

    <form id="myForm" action="http://www.365mini.com" method="post"> ...

  2. mybatis参数查询

    单个参数查询            在mapper.xml配置文件中配置                   <select id= "selectByNu" paramet ...

  3. CDMA电信短信猫支持189等电信号码可二次开发

    CDMA电信短信猫支持189等电信号码可二次开发 这款短信猫采用法国wavecom Q2358C模块,支持短信猫二次开发,可提供短信猫二次开发包下载测试.提供相关资料文档. 此款CDMA电信短信猫有串 ...

  4. SQL Server一些常见却不太记得住的命令

    一.数据库大小查询 1. exec sp_spaceused '表名'          --(SQL统计数据,大量事务操作后可能不准)2. exec sp_spaceused '表名', true  ...

  5. Linux安装系统注意事项及系统初始化

      Linux安装系统注意事项 1.分区 学习用途: /boot:200M /swap :内存的1到2倍 /:根据需要分配大小,比如虚拟机下总空间是15G,那么可以分配8——10G跟/分区,如果是生产 ...

  6. 使用URLConnection获取网页信息的基本流程

    参考自core java v2, chapter3 Networking. 注:URLConnection的子类HttpURLConnection被广泛用于Android网络客户端编程,它与apach ...

  7. html 学习笔记--基础篇

    最近被部门经理要求看一下html,重新看发现好多以前看过的只是都忘记了或者以前走马观花看过没有记得住的东西,正好趁此机会在博客上记录一下,顺便的如果以后需要查找,这里有记录的话可能会比上网查快一点(也 ...

  8. app->h5同步身份

    最近半年主要是进行手机端的开发,主要是H5平台和APP内嵌H5营销活动的支持,相对遇到的兼容性问题比较少些,只是iscroll性能,点透,手机浏览器缓存,手机性能提高. 今天总结下,工作项目中的app ...

  9. Android的AndroidManifest.xml文件的详解

    一.关于AndroidManifest.xml AndroidManifest.xml 是每个android程序中必须的文件.它位于整个项目的根目录,描述了package中暴露的组件(activiti ...

  10. HQL和Criteria(转)

    HQL(Hibernate Query Language)        面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写):HQL中查的是对 ...