2018-08-24 转别人

asp.net+js达成金额格式化,asp.netjs达成金额

基于用户须求,在输入金额时要格式化,即每几个人数字加逗号分隔,并保存两位小数。

思索到用户的心得,随使用JS对金额实行格式化,前台代码如下:

复制代码 代码如下:

<asp:TextBox ID=”txtAmount” runat=”server” onkeypress=”check()”
onkeyup=”run(this)”></asp:TextBox>

JS代码如下:

复制代码 代码如下:

//======检查输入的是否为数字
function check() {
    if (!((window.event.keyCode >= 48 && window.event.keyCode <=
57) || window.event.keyCode == 46 || window.event.keyCode == 45)) {
        window.event.keyCode = 0
    }
}
js达成金额格式化,金额文本框。//======格式化文本框的金额
function run(obj) {
    var objvalue = obj.value.replace(/[,]/g, “”),
        objlength = objvalue.length,
        dtmp = objvalue.indexOf(“.”),
        neg = objvalue.indexOf(“-“);
    var inttmp = 0,
        floattmp = -1;
    if (dtmp != -1) {
        inttmp = dtmp == 0 ? “0” : new String(objvalue).substring(0,
dtmp);
        floattmp = new String(objvalue).substring(dtmp + 1, objlength +
1);
        floattmp = floattmp.replace(/[^0-9]/g, “”);
    }
    else {
        inttmp = objvalue;
    }
    if (neg == 0) {
        inttmp = inttmp.replace(/[-]/g, “”);
    }
    inttmp = inttmp.replace(/[^0-9]/g, “”);
    var tmp = “”, str = “0000”;
    for (; inttmp.length > 3; ) {
        var temp = new String(inttmp / 1000);
        if (temp.indexOf(“.”) == -1) {
            tmp = “,000” + tmp;
            inttmp = temp;
        }
        else {
            var le = new String(temp).split(“.”)[1].length;
            tmp = “,” + new String(temp).split(“.”)[1] +
str.substring(0, 3 – le) + tmp;
            inttmp = new String(temp).split(“.”)[0];
        }
    }
    inttmp = inttmp + tmp;
    obj.value = neg == 0 ? “-” + inttmp + runing(floattmp) : inttmp +
runing(floattmp);
}
//======整理小数部分
function runing(val) {
    if (val != “-1” && val != “”) {
        var valvalue = 0 + “.” + val;
        if (val.length >= 2) {
            valvalue = parseFloat(valvalue).toFixed(2);
        }
        var temp = “.” + valvalue.split(“.”)[1];
        return temp;
    }
    else if (val != “0” && val == “”) {
        return “.”;
    }
    else {
        return “”;
    }
}

并且因为金额可输入负数,所以加上“neg = objvalue.indexOf(“-“)”的判断。

关于金额的格式化难题,平时碰着那种业务,觉得这一个还足以,也就留着,以供未来翻看方便!

依照用户必要,在输入金额时要格式化,即每四人数字加逗号分隔,并保留两位小数。
思索到用…

艾德itText金额输入(限制输入金额大小和小数点后两位)

标签(空格分隔): Android开发


案例一:回车完毕Tab跳转。

c#金额转换到中文大写金额

   /// <summary>
        /// 金额转换成中文大写金额
        /// </summary>
        /// <param name="LowerMoney">eg:10.74</param>
        /// <returns></returns>
        public static string MoneyToUpper(string LowerMoney)
        {
            string functionReturnValue = null;
            bool IsNegative = false; // 是否是负数
            if (LowerMoney.Trim().Substring(0, 1) == "-")
            {
                // 是负数则先转为正数
                LowerMoney = LowerMoney.Trim().Remove(0, 1);
                IsNegative = true;
            }
            string strLower = null;
            string strUpart = null;
            string strUpper = null;
            int iTemp = 0;
            // 保留两位小数 123.489→123.49  123.4→123.4
            LowerMoney = Math.Round(double.Parse(LowerMoney), 2).ToString();
            if (LowerMoney.IndexOf(".") > 0)
            {
                if (LowerMoney.IndexOf(".") == LowerMoney.Length - 2)
                {
                    LowerMoney = LowerMoney + "0";
                }
            }
            else
            {
                LowerMoney = LowerMoney + ".00";
            }
            strLower = LowerMoney;
            iTemp = 1;
            strUpper = "";
            while (iTemp <= strLower.Length)
            {
                switch (strLower.Substring(strLower.Length - iTemp, 1))
                {
                    case ".":
                        strUpart = "圆";
                        break;
                    case "0":
                        strUpart = "零";
                        break;
                    case "1":
                        strUpart = "壹";
                        break;
                    case "2":
                        strUpart = "贰";
                        break;
                    case "3":
                        strUpart = "叁";
                        break;
                    case "4":
                        strUpart = "肆";
                        break;
                    case "5":
                        strUpart = "伍";
                        break;
                    case "6":
                        strUpart = "陆";
                        break;
                    case "7":
                        strUpart = "柒";
                        break;
                    case "8":
                        strUpart = "捌";
                        break;
                    case "9":
                        strUpart = "玖";
                        break;
                }

                switch (iTemp)
                {
                    case 1:
                        strUpart = strUpart + "分";
                        break;
                    case 2:
                        strUpart = strUpart + "角";
                        break;
                    case 3:
                        strUpart = strUpart + "";
                        break;
                    case 4:
                        strUpart = strUpart + "";
                        break;
                    case 5:
                        strUpart = strUpart + "拾";
                        break;
                    case 6:
                        strUpart = strUpart + "佰";
                        break;
                    case 7:
                        strUpart = strUpart + "仟";
                        break;
                    case 8:
                        strUpart = strUpart + "万";
                        break;
                    case 9:
                        strUpart = strUpart + "拾";
                        break;
                    case 10:
                        strUpart = strUpart + "佰";
                        break;
                    case 11:
                        strUpart = strUpart + "仟";
                        break;
                    case 12:
                        strUpart = strUpart + "亿";
                        break;
                    case 13:
                        strUpart = strUpart + "拾";
                        break;
                    case 14:
                        strUpart = strUpart + "佰";
                        break;
                    case 15:
                        strUpart = strUpart + "仟";
                        break;
                    case 16:
                        strUpart = strUpart + "万";
                        break;
                    default:
                        strUpart = strUpart + "";
                        break;
                }

                strUpper = strUpart + strUpper;
                iTemp = iTemp + 1;
            }

            strUpper = strUpper.Replace("零拾", "零");
            strUpper = strUpper.Replace("零佰", "零");
            strUpper = strUpper.Replace("零仟", "零");
            strUpper = strUpper.Replace("零零零", "零");
            strUpper = strUpper.Replace("零零", "零");
            strUpper = strUpper.Replace("零角零分", "整");
            strUpper = strUpper.Replace("零分", "整");
            strUpper = strUpper.Replace("零角", "零");
            strUpper = strUpper.Replace("零亿零万零圆", "亿圆");
            strUpper = strUpper.Replace("亿零万零圆", "亿圆");
            strUpper = strUpper.Replace("零亿零万", "亿");
            strUpper = strUpper.Replace("零万零圆", "万圆");
            strUpper = strUpper.Replace("零亿", "亿");
            strUpper = strUpper.Replace("零万", "万");
            strUpper = strUpper.Replace("零圆", "圆");
            strUpper = strUpper.Replace("零零", "零");

            // 对壹圆以下的金额的处理
            if (strUpper.Substring(0, 1) == "圆")
            {
                strUpper = strUpper.Substring(1, strUpper.Length - 1);
            }
            if (strUpper.Substring(0, 1) == "零")
            {
                strUpper = strUpper.Substring(1, strUpper.Length - 1);
            }
            if (strUpper.Substring(0, 1) == "角")
            {
                strUpper = strUpper.Substring(1, strUpper.Length - 1);
            }
            if (strUpper.Substring(0, 1) == "分")
            {
                strUpper = strUpper.Substring(1, strUpper.Length - 1);
            }
            if (strUpper.Substring(0, 1) == "整")
            {
                strUpper = "零圆整";
            }
            functionReturnValue = strUpper;

            if (IsNegative == true)
            {
                return "负" + functionReturnValue;
            }
            else
            {
                return functionReturnValue;
            }
        }

 

decimal PriceSum = 32957.2654;

调用  var PriceSumChinese = MoneyToUpper(PriceSum.ToString());

结果:两万3000九佰伍拾7圆贰角九分

 

正则方法

/// <summary>
/// 人民币大写转换
/// </summary>
/// <param name="number">数字</param>
/// <returns>返回人民币大写,如:壹元整</returns>
public static string ConvertToChinese(decimal number)
{
    var s = number.ToString("#L#E#D#C#K#E#D#C#J#E#D#C#I#E#D#C#H#E#D#C#G#E#D#C#F#E#D#C#.0B0A");
    var d = Regex.Replace(s, @"((?<=-|^)[^1-9]*)|((?'z'0)[0A-E]*((?=[1-9])|(?'-z'(?=[F-L\.]|$))))|((?'b'[F-L])(?'z'0)[0A-L]*((?=[1-9])|(?'-z'(?=[\.]|$))))", "${b}${z}");
    var r = Regex.Replace(d, ".", m => "负元空零壹贰叁肆伍陆柒捌玖空空空空空空空分角拾佰仟万亿兆京垓秭穰"[m.Value[0] - '-'].ToString());
    return r;
}

 

Android中控制艾德itText输入内容、长度的主意有三种

  • 方案一:

    • 透过监听艾德itText的addTextChangedListener方法
  • 方案贰:通过setFilter()方法设置过滤器

    • 约等于自定义2个类达成InputFilter接口,复写filter这几个方法在里头进行连锁逻辑
  • 方案三:通过布局文件中,控件的性质来支配

    • 例如 maxLength、inputType、minLength等

响应文本框的onKeyDown事件,window.event.keyCode得到用户点击的keyCode。

需求

近些年在开发app的时候,收到了如此的供给,也正是打赏金额,用户能够自定义金额,并且要求用户输入的金额无法当先500同时间限制制小数点后两位小数,也就是最多输入499.9玖元。那么那个只可以协调自定义了。能够见到,这几个要求以上的三种方法,第二种并不能落成如此的逻辑要求,一时半刻解除,也正是只有方案一和方案二了.
有关google为啥有诸如此类的三种格局控制艾德itText相关操作,能够查阅那一个InputFilter详解、TextWatcher详解
所以接下去能够交到最终的2个落实方案,那正是落到实处InputFilter接口重写filter那个方法来促成上述须求。

(*)keyCode和ASCII不是完全一致,主键盘的1和小键盘的1的ASCII壹样,但是keyCode分化等。回车的keyCode为
一3,Tab的keyCode为九。
<body
onkeydown=”if(window.event.keyCode==13){window.event.keyCode=9;}”>
唯有些的键才能被沟通,大多数是不行的,有权力难点。
键盘码与ASCII码差别等。

交付方案

在方案代码发轫从前,大家供给先掌握一下filter方法的顺序参数的含义:

CharSequence filter (CharSequence source, 
                int start, 
                int end, 
                Spanned dest, 
                int dstart, 
                int dend)

参数简介

  • source 新输入的字符串
  • start 新输入的字符串开端下标,一般为0
  • end 新输入的字符串终点下标,1般为source长度-一
  • dest 输入此前文本的内容
  • dstart 原内容伊始坐标 一般为0
  • dend 原内容终点坐标,1般为dest长度-一

能够看到我们能够收获到原来输入的字符串,还有大家就要输入的字符串,然后关于光标所在的职位(能够的出来的),而且大家还足以得到原字符串和即将输入字符串的序幕坐标,那么我们就来搞工作啊。废话不多说,直接上代码

/**
 * Created by ruolanmingyue on 2017/10/26.
 *
 * @function 用于过滤输入      防止输入大于500元还有就是限制小数点之后两位
 */

public class EditInputFilter implements InputFilter {

    /**
     * 最大数字
     */
    public static final int MAX_VALUE = 500;

    /**
     * 小数点后的数字的位数
     */
    public static final int POINTER_LENGTH = 2;

    private static final String POINTER = ".";

    Pattern p;

    public EditInputFilter() {
        //用于匹配输入的是0-9  .  这几个数字和字符
        p = Pattern.compile("([0-9]|\\.)*");
    }

    /**
     * source    新输入的字符串
     * start    新输入的字符串起始下标,一般为0
     * end    新输入的字符串终点下标,一般为source长度-1
     * dest    输入之前文本框内容
     * dstart    原内容起始坐标,一般为0
     * dend    原内容终点坐标,一般为dest长度-1
     */

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
                               Spanned dest, int dstart, int dend) {

        String sourceText = source.toString();
        String destText = dest.toString();
//验证删除等按键
        if (TextUtils.isEmpty(sourceText)) {
            if (dstart == 0 && destText.indexOf(POINTER) == 1) {//保证小数点不在第一个位置
                return "0";
            }
            return "";
        }
        Matcher matcher = p.matcher(source);
        //已经输入小数点的情况下,只能输入数字
        if (destText.contains(POINTER)) {
            if (!matcher.matches()) {
                return "";
            } else {
                if (POINTER.equals(source)) { //只能输入一个小数点
                    return "";
                }
            }
            //验证小数点精度,保证小数点后只能输入两位
            int index = destText.indexOf(POINTER);
            int length = destText.trim().length() - index;
            if (length > POINTER_LENGTH && dstart > index) {
                return "";
            }
        } else {
            //没有输入小数点的情况下,只能输入小数点和数字,但首位不能输入小数点和0
            if (!matcher.matches()) {
                return "";
            } else {
                if ((POINTER.equals(source)) && dstart == 0) {//第一个位置输入小数点的情况
                    return "0.";
                } else if ("0".equals(source) && dstart == 0) {
                    return "";
                }
            }
        }
//        dstart
        //修复当光标定位到第一位的时候 还能输入其他的    这个是为了修复以下的情况
        /**
         * <>
         *     当如下情况的时候  也就是 已经输入了23.45   这个时候限制是500元
         *     那么这个时候如果把光标移动2前面  也就是第0位  在输入一个5  那么这个实际的参与下面的
         *     判断的sumText > MAX_VALUE  是23.455  这个是不大于 500的   但是实际情况是523  这个时候
         *     已经大于500了  所以之前的是存在bug的   这个要进行修正 也就是拿到的比较数应该是523.45  而不是23.455
         *     所以有了下面的分隔  也就是  把23.45  (因为这个时候dstart=0)  分隔成 ""  和23.45  然后把  5放到中间
         *     进行拼接 也就是  "" + 5 + 23.45  也就是523.45  然后在进行和500比较
         *     还有一个比较明显的就是   23.45   这个时候光标在2和3 之间  那么如果修正之前  是23.455   修正之后  dstart = 1
         *     这个时候分隔是 "2"  "3.45"   这个时候拼接是253.45  然后和500比较  以此类推
         * </>
         */
        String first = destText.substring(0,dstart);

        String second = destText.substring(dstart,destText.length());
//        dend
        String sum = first + sourceText + second;
        //验证输入金额的大小
        double sumText = Double.parseDouble(sum);
        //这里得到输入完之后需要计算的金额  如果这个金额大于了事先设定的金额,那么久直接返回  不需要加入输入的字符
        if (sumText > MAX_VALUE) {
        //
            Toast.makeText(MyApp.getContext(), MyApp.getContext().getResources().getString(R.string.appreciate_input), Toast.LENGTH_SHORT).show();
            return dest.subSequence(dstart, dend);
        }
        //如果输入的金额小于事先规定的金额
        return dest.subSequence(dstart, dend) + sourceText;
    }
}

keyCode
8:退格键
46:delete
37-40: 方向键
4八-伍七:小键盘区的数字
96-拾5:主键盘区的数字
1十、190:小键盘区和主键盘区的小数点
18玖、十九:小键盘区和主键盘区的负号
金沙注册送58,13:回车
玖: Tab 正是十二分把热点移到下三个文本框的东东。

选用方法

 EditText editText = new EditText(getContext());

        InputFilter[] filters = {new EditInputFilter()};

        editText.setFilters(filters);

案例二:金额文本框
财务相关系统中提到到金额的公文框有如下须要:
进入金额文本文本框不行使中文输入法
不能够输入非数字
热点在文本框中时文本框左对齐;大旨离开文本框时文本框右对齐,展现千分位
禁止使用输入法:style=“ime-mode:disabled” //包容FF、IE,不包容Chrome
禁 止键入非法值,只有这一个才能被键入(k == 九) || (k == 一叁) ||
(k==四6)||(k==八)||(k==18九)||(k==十九)||(k==190)||(k==1十)|| (k>=4捌 &&
k<=伍七)||(k>=九陆 && k<=十5)||(k>=三七 && k<=40)。
onkeydown=”return numonKeyDown()” 不要写成onkeydown=”numonKeyDown()”
区分事件响应函数和事件响应函数调用的函数。
明确命令禁止粘贴(伟大的 Tester),<input onpaste=“return false;”
,太暴力,应该只是禁止粘贴非法值。在onpaste中通过clipboardData.getData(‘Text’)取到粘贴板中的值,然后遍历每一个字符,看是或不是是合法的值,假使壹切是官方值才允许粘贴,只要有一个违规值就不准粘贴。charAt、charCodeAt(查字符集.doc)
典型在的时候左对齐没有千分位,主题不在时右对齐千分位。this.style.textAlign=’right’
添加千分位的不二秘籍,见备注(*)

参照文书档案

  • Android达成艾德itText输入金额
    • 但是这几个小说写的有bug,发现的bug如下三个
      • 一、输入金额之后,当手动改edittext里面包车型客车光标的时候,比如刚开首输入的是贰三.2二元,那个时候把光标移动到二和3之间,那么我们还能输入222三.2二元,约等于不吻合不可能超出500元必要,那几个在地点的表达中有详实的辨证
      • 2、当改动光标在.后边的时候,也是足以说入数字的,也正是不适合输入数字限制两位小数要求

========补充知识==================
(?=exp)相称exp后边的职务
(?=exp)
也叫零急剧正预测先行断言,它预知本身出现的职位的末端能相称表达式exp。比如\b\w+(?=ing\b),相配以ing结尾的单词的如今部分(除了
ing以外的有个别),如搜寻I’m singing while you’re

dancing.时,它会相配sing和danc。

function f(){
        var txts=document.getElementsByTagName('input');
        for(var i=0;i<txts.length;i++){
            //回车转换为tab
            txts[i].onkeydown=function(){  
                if(window.event.keyCode==13){
                window.event.keyCode=9;
                }
            }
            txts[i].onpaste=function(){
                var usrInput=clipboardData.getData('Text');
                var k;
                for(var i=0;i<usrInput.length;i++){
                    k=usrInput.charCodeAt(i);
                    //只能黏贴.或0-9的数字,参考ASCII字符集。
                    if((k==46) ||(k>=48 && k<=56)){
                    }else{
                        return false;
                    }
                }
            }
        }
    }

千分位(练习代码):

function commafy(n)
{
    var re=/\d{1,3}(?=(\d{3})+$)/g; //必须是以\d{3}结尾,前面必须是1-3个数字,但替换的时候,不包含结尾的\d{3}个数字。  
    var n1=n.replace(/^(\d+)((\.\d+)?)$/,function(s,s1,s2){return s1.replace(re,“$&,”)+s2;});
  return n1;
}

function addQianFenWei(txtBox)
{
    txtBox.value=commafy(txtBox.value);
}
function removeQianFenWei(txtBox)
{
    txtBox.value=txtBox.value.replace(/,/g,"");//如果是replace(',','')是只替换第一个
}

<script type="text/javascript">
    function commafy(n)
    {
    var re=/\d{1,3}(?=(\d{3})+$)/g; //匹配1到3个数字后面跟3个数字,但不含最后的3个数字。
    var n1=n.replace(/^(\d+)((\.\d+)?)$/,function(s,s1,s2){return s1.replace(re,"$&,")+s2;});
    return n1;
    }

    function setQFW(){
    var objTxt=document.getElementById('txtqfw');


    var r='';
    for(var i=objTxt.value.length-1;i>=0;i--){
    if(i%3==0){
        r+=objTxt.value.charAt(i)+',';

    }else{
    r+=objTxt.value.charAt(i);
    }

    }
 objTxt.value=r;
    //objTxt.value=commafy(objTxt.value);
    }
</script>

相关文章

网站地图xml地图