以下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. ResourceBundle读取中文properties文件问题

    昨天遇到一个问题,用ResourceBundle读取中文字符串资源文件时,死活读不出来. 一开始以为是文件路径不对,后来发现如果默认properties文件时英文就没问题.我的项目代码是在src目录下 ...

  2. (原)caffe在ubuntu中设置GPU的ID号及使用多个GPU

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5884892.html 参考网址: http://caffe.berkeleyvision.org/tu ...

  3. (原)编译caffe时提示未定义的引用(undefined reference to)

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5864715.html 参考网址: https://github.com/BVLC/caffe/issu ...

  4. PHP函数参数的引用传递和值传递

    函数的参数传递有两种方式 1,值传递 常见的 test($param)  方式就是值传递,在函数内部修改$param,不会影响外部变量$param的值 2,引用传递 参数是引用传递的方式,此时函数内部 ...

  5. ElasticSearch入门知识扫盲

    ElasticSearch 入门介绍 tags: 第三方 lucene [toc] 1. what Elastic Search(ES)是什么 全文检索和lucene 全文检索 优点:高效,准确,分词 ...

  6. https://github.com/aptana/studio3/releases aptana

    https://github.com/aptana/studio3/releases  aptana

  7. css元素隐藏(display:none和visibility:hidden)

    在css中, display:none和visibility:hidden都能够使元素隐藏.但是两者所带来的效果完全不同. css  display:none 当使用该样式的时候,HTML元素的宽高等 ...

  8. sublime快捷键收藏

    快速查找(ctrl + P)输入@+函数名可以快速找到函数.输入#+文本可以快速进行文件内文本匹配.3. 多行游标功能(ctrl + D,非常实用)如何将文件中的某个单词更改为另一个?方法一:利用查找 ...

  9. Shell变量替换,命令替换,转义字符

    如果表达式中包含特殊字符,Shell 将会进行替换.例如,在双引号中使用变量就是一种替换,转义字符也是一种替换. 举个例子: #!/bin/bash a=10 echo -e "Value ...

  10. Linux系统编程(19)——正则表达式在sed和awk中的使用

    sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出.sed和 ...