对Textbox的值转换为带千位符和小数的Decimal字符串
以下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字符串的更多相关文章
- js实现千位符分隔
前几天面试做保险项目的公司,被问到了一道实现千位符分割方法的题,乍一看挺简单,但做起来最后却没给出来一个合适的解决方法.回来自己琢磨了一个还行的答案. var num = 3899000001, ar ...
- js千位符 | js 千位分隔符 | js 金额格式化
js 千位分隔符 千位分隔符,其实就是数字中的逗号.依西方的习惯,人们在数字中加进一个符号,以免因数字位数太多而难以看出它的值.所以人们在数字中,每隔三位数加进一个逗号,也就是千位分隔符,以便更加容易 ...
- wpf 千位符 格式化字符串
StringFormat={}{0:N2}}//格式话字符串,增加千位符,2保留小数点后2位 StringFormat={}{0:N0}}//格式话字符串,增加千位符,无小数点后
- js-格式化数字保留两位小数-带千分符
很多时候发现有时候js会提示自带函数不能使用,所以自己找了很多资料实现了个 html <input type="text" class="input_text in ...
- JS实现数字千位符格式化方法
/** * [number_format 参数说明:] * @param {[type]} number [number:要格式化的数字] * @param {[type]} decimals [de ...
- MySQL中大数字加减,不产生千位符和科学计数
mysql数字加减科学计数法 这两天因为需求,需要获取一张表的流水号.规则是这样的.当前日期+8位流水号.比如:2015062400000001,2015062400000002,2015062400 ...
- vue 自定义千位符过滤器
在main.js页面全局引入 Vue.filter('formatNum', function(value) { if(!value) return '' let num = value.toStri ...
- JS给数字加千位分隔符
本文原链接:https://www.jianshu.com/p/928c68f92c0c JavaScript实现千位分隔符 将普通的数字转换为带千位分隔符格式的数字字符串是一个非常常见的问题,千位分 ...
- javascript中将整数添加千位符号
如果num是整数的话,将其转换成带千位符号的字符串: Number(num).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + ','); 另 ...
随机推荐
- Git 笔记二-Git安装与初始配置
git 笔记二-Git安装与初始配置 Git的安装 由于我日常生活和工作基本上都是在Windows上,因此此处只说windows上的安装.Windows上的安装和其他程序一样,只需要到http://g ...
- [HeadFirst-HTMLCSS入门][第十一章布局排版]
流 浮动布局 冻结布局 凝胶布局 绝对布局 表格显示布局 postion 绝对 静态 固定 相对 浮动元素 必须指明宽度 解决重合 中缝 设置外边距留中缝,好看一点 clear标签 不准左右有浮动元素 ...
- .NET批量大数据插入性能分析及比较
数据插入使用了以下几种方式 1. 逐条数据插入2. 拼接sql语句批量插入3. 拼接sql语句并使用Transaction4. 拼接sql语句并使用SqlTransaction5. 使用DataAda ...
- CLR via C# - GC
//像背书一样,记录下吧 1.CLR分配资源 托管堆上维护着一个指针NextObjPtr.该指针表示下一个新建对象在托管堆上的位置.C#的new Object会产生IL newobj指令,NextOb ...
- Git(Repo)常用命令收集
(注意: 只记录工作中实际使用的命令) 同步android源码 repo sync:(可加-c,只取当前分支: 可加-j4,线程数量) 查看android源码下所有项目的git状态 rep ...
- Biztalk2010安装及配置问题集
在安装Biztalk2010时,碰到很多问题,有的是粗心有的也是比较bt的,如: 1)在win7 64下引入x86 的cab,有点粗心,幸亏给我报错版本不兼容(呵呵): 2)安装的时候 不知道为什么计 ...
- xcode 7 添加空模板
文件下载链接: http://pan.baidu.com/s/1pKbyf4R 密码: ppi7 下载完成后将模板放入以下路径应用程序->Xcode->右键显示包内容->/Conte ...
- 自定义带弹性效果的pageControl
分三部分实现,在drawrect方法里画出灰色背景,根据pageCount创建对应个数的dotView放置在对应位置,并隐藏,创建一个CAShapeView类型的layer,根据scrollView的 ...
- 安卓tabhost和子Activity通信方法
发现很多同学在问这个问题 1个tabhost对应的类假设是T,假设包含2个子tab,每个是1个activity,假设叫a,b,对应的类假设是A和B 那么有这几个问题 1.a如何调用b的方法,或者说发送 ...
- StringBuilder是不是线程安全的?
测试条件: 开启2个并行执行任务,往同一个StringBuilder对象写入值 测试代码: ; static StringBuilder sbIsThreadSafe = new StringBuil ...