【问题标题】:Arrangement of two string charecters into one string using loop使用循环将两个字符串字符排列成一个字符串
【发布时间】:2012-12-10 06:15:29
【问题描述】:

我有两个字符串应该放在一个字符串中。第一个字符串是输入值,第二个字符串是第一个字符串的样式。
下面是示例 -
输入字符串( var val ) - 9165678823
模式字符串( var mask ) - (999)999-9999
输出字符串应该看起来像( var startVal ) - (916)567-8823
我试过了锻炼,这是我的代码

            var val = $(control).data("loadMaskValue"); // Input Value
            var mask = $(control).attr("mask");         //Masking Pattern
            var startVal = "";
            var j = 0;

            for (var i = 0; i < mask.length; i++) {
                    var c = mask.charAt(j);
                    if (c == '9' || c == 'X' || c == 'A') {    //Checks the char is normal char 
                        startVal += val.charAt(j);
                    }
                    else {
                        startVal += c;                      //Inserts the special char to string like ( ) -
                        startVal += val.charAt(j);
                    }
                    j = startVal.length;
                }

这段代码的问题是它错过了中间的一个数字。这段代码的结果是
startValue - (965)688-2
请帮帮我。

【问题讨论】:

  • 你不能只解析输入并构造一个新字符串吗?查看输入,当 i==0 时添加 (,当 i==2 时添加 )
  • 模式可以是动态的。你不能硬编码 i 的值。

标签: javascript jquery string algorithm loops


【解决方案1】:

这是一个稍微简单的实现:

var input = '9165678823';
var mask = '(999)999-9999';

var output = '';
var offset = 0;

for (var i = 0; i < mask.length; i++) {
    var char = mask.charAt(i);

    if ('9XA'.indexOf(char) != -1) {
        output += input.charAt(i - offset);
    } else {
        output += mask.charAt(i);
        offset += 1;
    }
}

console.log(output);

​确保 input 的开头和结尾已删除所有空格。

演示:http://jsfiddle.net/qWtjk/

【讨论】:

    【解决方案2】:

    您可以使用正则表达式来取出元素。检查小提琴:http://jsfiddle.net/BuddhiP/9MmqS/ var str='9165678823'; var regEx = new RegExp("(\d{3})(\d{3})(\d{4})");

    var m = regEx.exec(str);
    var res = '(' + m[1] + ')' + m[2] + '-' + m[3];
    console.log(res);
    

    结果是 (916)567-8823

    更新:如何使用动态模式使其工作。检查更新的小提琴:http://jsfiddle.net/BuddhiP/9MmqS/

    $(function() {
        var str= '9165678823';
        var regEx = new RegExp("(\\d{3})(\\d{3})(\\d{4})");
    
        var m = regEx.exec(str);
        var mask = "({0}){1}-{2}";
        var res = mask.supplant(m.slice(1));
        console.log(res);
    });​
    

    从这里使用替代方法:http://javascript.crockford.com/remedial.html

    一旦你理解了你的正则表达式,你就可以让它与任何模式和掩码一起工作。

    【讨论】:

    • 我猜这行不通,因为掩码可以有不同的格式。
    • 你也可以只使用替换:'9165678823'.replace(/(\d{3})(\d{3})(\d{3})/, '($1)$2-$3');
    • @BhuddhiP,Pattern 字符串是动态的,它不能是静态的,带有像这样的分隔符字符“(”,“)”和这个“-”
    • @ShishirKumarM,检查如何使用动态模式完成此操作。我也会让它与任意数量的匹配一起工作。对这种功能使用循环会降低性能。
    • @Blender,确实如此。好点子。但我更喜欢使用 supplant 方法(我后来添加的),因为它看起来更清晰,至少在这种情况下是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2020-04-13
    • 2012-01-14
    相关资源
    最近更新 更多