Javascript String.format

2008-04-17 11:57 | 分类 WebDev | By ming | 2 条评论 »

模仿.net的string.Format方法,进行字符串的格式化。主要是通过替换{数字}来实现。

方法一:

function format1() {
    var args = Array.prototype.slice.call(arguments);
    /*arguments不是Array,所以要转换成Array*/
    if (args.length < 2 || typeof args[0] != 'string')
        throw new Error('String Format Invalid');
    var format = args.shift();
    var l = args.length - 1;
    return format.replace(/\{(\d+)\}/g, function($0, $1) {
        if (l < $1)
            throw new Error('String Format Invalid');
        return args[$1];
    });
}

方法二:

function format2() {
    var args = Array.prototype.slice.call(arguments);
    if (args.length < 2 || typeof args[0] != 'string')
        throw new Error('String Format Invalid');
    var format = args.shift();
    var arr = format.match(/\{(\d+)\}/g);
    for (var i = 0, l = arr.length; i < l; i++) {
        format = format.replace(arr[i], args[i]);
    }
    return format;
}

/*此方法因欠缺考虑,只能用于逐个替换,现已废弃,请使用方法一

方法三:

function format3() {
    if (arguments.length < 2 || typeof arguments[0] != 'string')
        throw new Error('String Format Invalid');
    var format = arguments[0];
    var re = /\{(\d+)\}/g;
    for (var i = 1, l = arguments.length - 1; re.test(format); i++) {
        if (l < i)
            throw new Error('String Format Invalid');
        format = format.replace(re, arguments[i]);
    }
    return format;
}    */

经地测试(10000次循环),以上3个函数中format3性能最好(写的时候欠考虑,达不到format目的,此方法现已废弃),format1稍差,format2最差,

(30000次循环)情况下,不过估计没有人会一口气运行这么多次,format1也就比format3稍差一点。(诶,format1看起来多简洁啊,为啥不是最好的呢,看来String.prototype.replace(regexp,function)依靠它的内置循环也不见得是最好的)

使用:

format1('start-{0}-{1}-{2}-{3}-{4}-end','a','b','c','d','e'); 结果 'start-a-b-c-d-e-end'

像{{0}}、{{{0}}}这样的只会被替换成{'结果'},{{'结果'}}。

Javascript 逻辑运算符

2008-04-17 11:56 | 分类 WebDev | By ming | 发表评论 »

javascript的逻辑运算符(按优先级排序):

运算符 用法 描述
非(!) !expr 如果 expr 为真则返回假,否则返回真。
与(&&) expr1 && expr2 如果 expr1 为假则返回之,否则返回 expr2
或(||) expr1 ||
expr2
如果 expr1 为真则返回之,否则返回 expr2

javascript中undefinednull
0""NaNfalse都是无意义的,它们转换为Boolean类型的值都是false,除此之外的值都被认为是有意义的。 这三个逻辑运算符中,逻辑非(!)操作在expr不是Boolean类型的时候,把expr转换为Boolean类型的值,再返回;而逻辑与(&&)和逻辑非(||)操作则不进行转换,直接返回它们的值。 逻辑非操作(!):!expr,如果expr是有意义的,那么转换为Boolean类型的值就为true,那么取反后为false,所以返回false;否则返回true。
逻辑与操作(&&):expr1
&& expr2 &&
expr3 && expr4, 它返回的是=>从第1个开始,遇到无意义的返回,否则(即都为有意义)返回最后一个。
逻辑或操作(||):expr1 || expr2 || expr3 || expr4,它返回的是=>从第1个开始,遇到有意义的返回,否则(都为无意义)返回最后一个。 关于Boolean类型转换,javascript
Boolean()这个内置的函数,它把任何类型的值都转换为Boolean类型(使用这个函数转换后的数据类型为Object类型)。
ifwhile等语句中,如if(condition)、while(condition),都是判断condition是否有意义。
Examples: var a=undefined,b=null,c=0,d='',e=1,f=2,g='a';

语句 结果
!a !!!a !b !!!b !c !!!c !d !!!d true (每多一个!号就取反一次)
!!a !!b !!c !!d false
true && false true && true e && a f && b g &&
a e && f f && g
false true (左边true取右边) a b a f g
false && true false && false d && a d && b d &&
e d && g
false false (左边false取左边) a b e g
true || false true || true e || a f || b g || a e || f f || g true true (左边true取左边) e f g e f
false || true false || false a || e a || f a || g a || b a || c true false (左边false取右边) e f g b c
a || b || c || d ((a || b) || c) || d a || e || b || f ((a || e) || b) || f e ||
f || g (e || f) || g
d d e e e e
a && b && c && d ((a && b) && c) &&
d a && e && b && f ((a && e) && b) &&
f e && f && g (e && f) && g
a a a a g g
a && b || c (a && b) || c a || b && c a || (b &&
c) e && f || g (e && f) || g e || f && g e || (f &&
g)
c c b b f f e e

Wordpress 2.5 引号问题

2008-04-16 15:44 | 分类 网络相关 | By ming | 发表评论 »

    今天居然发现这该死的wordpress居然把半角的符号都转换成全角的,真tmd火大...

    一把火就把2.3更到2.5了,嗯,直接用ftp文件替换掉,再在wp-admin/upgrade.php升级下数据库,就ok了...

  不过2.5还是会把半角替换成全角,所以按网上的方法,找到wptexturize这个函数,这个版本内容有些不一样了.把$static_characters、$static_replacements、$dynamic_characters、$dynamic_replacements这几个变量给注释掉,再把

$curl = str_replace($static_characters, $static_replacements, $curl);
            // regular expressions
            $curl = preg_replace($dynamic_characters, $dynamic_replacements, $curl);

这两句也给注释掉,嗯,好了。

真不是一般般的贱啊,居然。。。哼哼

JavaScript 人民币数字转换成大写

2008-04-15 11:15 | 分类 WebDev | By ming | 发表评论 »

    前些天刚好用到,在网上搜出来就那么一个,看起来比较乱,所以干脆自已写一个。主要是利用数组来完成(刚好那么多个元素),目前最大支持到千亿为止。

<html>
<body>
人民币数值:<input type='text' id='fchars' />
<input type='button' id='fsubmit' value='转换' />
<hr />
结果:<div id='fresult'></div>

<script type='text/javascript'>
var $ = function(id) {
    return document.getElementById(id);
};
$('fsubmit').onclick = function() {
    $('fresult').innerHTML = new rmbConverter().transToUpper($('fchars').value);
};

var rmbConverter = function() {
};

rmbConverter.prototype = {
    upperChars: ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'],
    /*数组刚好10个元素,下标从0到9,那么数字0-9刚好对应upperChars[0-9]*/
    upperUnits: ['', '拾', '佰', '仟', '万', '亿'],
    /*转换四位数*/
    transThousand: function(floatStr) {
        var tdata = {
            result: parseInt(floatStr) > 0,/*是否全为零*/
            data: [],
            bZero: false/*低位全为零*/
        };
        if (tdata.result) {
            /*从高位开始取*/
            for (var l = floatStr.length, i = l - 1; i >= 0; i--) {
                var notZero = floatStr.charAt(i) > 0;
                if (notZero) {
                    tdata.data.push(this.upperChars[floatStr.charAt(i)]);
                    tdata.data.push(this.upperUnits[i]);
                } else {
                    if (parseInt(floatStr.substr(0, i + 1)) == 0) {
                        tdata.bZero = true;
                        continue;
                    }
                    tdata.data.push(this.upperChars[0]);
                }
            }
            tdata.data = tdata.data.join('').replace(/[\u96F6]+/g,'\u96F6');
            /*对可能出现的多个相连的零更换成单个*/
        }
        return tdata;
    },
    transLeft: function(floatStr) {/*转换整数部分*/
        var result = [];
        floatStr = floatStr.split('').reverse().join('');/*反转字符串*/
        for (var l = floatStr.length, i = 0; i < l; i += 4) {
            /*每次取四个转换*/
            var tdata = this.transThousand(floatStr.substr(i, 4));
            if (tdata.result) {
                if (tdata.bZero)
                    result.unshift(this.upperChars[0]);//补全低位的零
                if (i == 4)
                    result.unshift(this.upperUnits[4]);
                else if (i == 8)
                    result.unshift(this.upperUnits[5]);
                result.unshift(tdata.data);               
            }
        }
        return result.join('').replace(/[\u96F6]+/g,'\u96F6');
    },
    transToUpper: function(floatStr) {
        var result = [];
        var floatArr = ('' + floatStr).split('.');//把人民币分割成两部分:整数、小数
        if (floatArr.length > 1) {
            for (var i = 0, l = floatArr[1].length; i < l && i < 2; i++) {/*只保留两位小数*/
                result.unshift(this.upperChars[floatArr[1].charAt(i)]);
            }
            result.push(' 点 ');/*整数、小数之间分隔符*/
        }
        result.push(this.transLeft(floatArr[0]));
        return result.reverse().join('');
    }
};
</script>
</body></html>

使用 var converter =  new rmbConverter();

     converter.transToUpper(123456789.012);

    结果:"壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖 点 零壹"

简洁高效的 JavaScript 汉字编码转换

2008-04-14 11:57 | 分类 WebDev | By ming | 发表评论 »

    无意中搜索到关于js汉字编码转换的东东,不过网上写的都不够简洁,所以修改了下。

  js关于汉字转换成ascii或unicode主要是用escape及与 正则表达式 replace来完成,反过来的话则比较简单。。

String.cnStringToAscii = function(cnString) {//汉字转换ascii
    return escape(cnString).replace(/%u/g, '\&#x');
};

String.cnStringToUnicode = function(cnString) {//汉字转换unicode
    return escape(cnString).replace(/%/g, '\\');
};

/**
*charCodes ascii或unicode字符串
*regexp 匹配规则
*/
String.charCodeToCnString = function(charCodes, regexp) {
    return charCodes.replace(regexp, function($0, $1, $2) {
        return String.fromCharCode(
            parseInt($2, 16)/*把16进制的字符串转换成int型数字*/
        );
    });
};

String.asciiToCnString = function(asciiChars) {//ascii转换成汉字
    return String.charCodeToCnString(asciiChars, /(\&#x)(\w{4})/gi);
};

String.unicodeToCnString = function(unicodeChars) {//unicode转换成汉字,高效的..

    /*unicode转换成汉字不需要像ascii那么麻烦*/
    return unicodeChars + '';//虽然它已经是String类型,但再这样转换成String类型,居然直接变汉字了。
    //unicodeChars.split('\\u')[0];split也可以变成汉字,可以用任意'非中文字符'来split,如'\\','safdasf'等等。
    //unicodeChars.split('').join('');//也是可以的,这样每个字都成为数组的一个元素,与上一句一样
    //return String.charCodeToCnString(unicodeChars, /(\&#x)(\w{4})/gi); 这个效率最差
};

Javascript 人民币数字转换成大写

2008-04-14 11:15 | 分类 WebDev | By ming | 发表评论 »

    前些天刚好用到,在网上搜出来就那么一个,看起来比较乱,所以干脆自已写一个。主要是利用数组来完成(刚好那么多个元素)。

<html>
<body>
人民币数值:<input type='text' id='fchars' />
<input type='button' id='fsubmit' value='转换' />
<hr />
结果:<div id='fresult'></div>

<script type='text/javascript'>
var $ = function(id) {
    return document.getElementById(id);
};
$('fsubmit').onclick = function() {
    $('fresult').innerHTML = new rmbConverter().transToUpper($('fchars').value);
};

var rmbConverter = function() {
};

rmbConverter.prototype = {
    upperChars: ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'],
    /*数组刚好10个元素,下标从0到9,那么数字0-9刚好对应upperChars[0-9]*/
    upperUnits: ['', '拾', '佰', '仟', '萬', '亿'],
    /*转换四位数*/
    transThousand: function(floatStr) {
        var tdata = {
            result: parseInt(floatStr) > 0,/*是否全为零*/
            data: [],
            bZero: false/*低位全为零*/
        };
        if (tdata.result) {
            /*从高位开始取*/
            for (var l = floatStr.length, i = l - 1; i >= 0; i--) {
                var notZero = floatStr.charAt(i) > 0;
                if (notZero) {
                    tdata.data.push(this.upperChars[floatStr.charAt(i)]);
                    tdata.data.push(this.upperUnits[i]);
                } else {
                    if (parseInt(floatStr.substr(0, i + 1)) == 0) {
                        tdata.bZero = true;
                        continue;
                    }
                    tdata.data.push(this.upperChars[0]);
                }
            }
            tdata.data = tdata.data.join('').replace(/[\u96F6]+/g,'\u96F6');
            /*对可能出现的多个相连的零更换成单个*/
        }
        return tdata;
    },
    transLeft: function(floatStr) {/*转换整数部分*/
        var result = [];
        floatStr = floatStr.split('').reverse().join('');/*反转字符串*/
        for (var l = floatStr.length, i = 0; i < l; i += 4) {
            /*每次取四个转换*/
            var tdata = this.transThousand(floatStr.substr(i, 4));
            if (tdata.result) {
                if (tdata.bZero)
                    result.unshift(this.upperChars[0]);//补全低位的零
                if (i == 4)
                    result.unshift(this.upperUnits[4]);
                else if (i == 8)
                    result.unshift(this.upperUnits[5]);
                result.unshift(tdata.data);               
            }
        }
        return result.join('').replace(/[\u96F6]+/g,'\u96F6');
    },
    transToUpper: function(floatStr) {
        var result = [];
        var floatArr = ('' + floatStr).split('.');//把人民币分割成两部分:整数、小数
        if (floatArr.length > 1) {
            for (var i = 0, l = floatArr[1].length; i < l && i < 2; i++) {/*只保留两位小数*/
                result.unshift(this.upperChars[floatArr[1].charAt(i)]);
            }
            result.push(' 点 ');/*整数、小数之间分隔符*/
        }
        result.push(this.transLeft(floatArr[0]));
        return result.reverse().join('');
    }
};
</script>
</body></html>

使用 var converter =  new rmbConverter();

     converter.transToUpper(123456789.012);

    结果:"壹亿贰仟叁佰肆拾伍萬陆仟柒佰捌拾玖 点 零壹"

firebug 定位页面元素、函数

2008-04-09 11:38 | 分类 软件应用 | By ming | 发表评论 »

    cap1

    Inspect是用来快速定位到页面上具体元素的。。。使用方法为:先按下Inspect按钮

cap6

    移动鼠标,指向具体的页面上的元素:

cap7

    可以看到上图被定位的网页元素被加了一个蓝色的框,HTML标签下的内容也定位到了这个网页元素的源码。按下鼠标左键以后就能完成定位。

cap8

    这时候按edit,可以对此元素的内容进行修改:

cap9

    改变后:

cap10

    很简单。。。

    本来Profile以为只是用来做性能测试的,没想到可以定位到函数,先按下这个按钮:

cap2

    再执行一个js函数,比如按一个按钮什么的(只要这个按钮的onclick是function就行):

    cap3

cap4

    鼠标指向某个具体的函数:

cap5 

    可以看到这个函数下面的下划线,再点进去,跳转到了具体的函数

cap11 

    嗯,要是点的是按钮,而且是写成类似这样"<input type='button' onclick='popupform1()' />"的话,就会出现:

cap12 

    多了一个onclick。。。

    嗯,就是这样子了。。。

终于关了qq空间

2008-04-08 20:05 | 分类 网络相关 | By ming | 发表评论 »

http://imgcache.qq.com/qzone/web/load_login_2.htm 复制这个地址到浏览器地址栏,Enter。 填好表格就好了。。。。。

似乎这n个月前就有了。。真落后。。。诶。。。