主題: [其他] [求助]超怪的字串轉數字的問題Javascript [打印本頁]
發表人:
ROACH 時間: 2009-2-25 10:06 AM 主題: [求助]超怪的字串轉數字的問題Javascript
想問一下一個簡單的換算
輸入字串0201 理論上用eval轉成數字時應該會變成201
可是它卻輸出129
為什麼會這樣呢???
我程式是想排除使用者輸入的日期 20090228~20090231
所以我會擷取後面的月+日 我用 substring(4,8)
function checkdate(x)
{
alert(x);
alert(eval(x));
}
checkdate("0201");
發表人:
陽だまり 時間: 2009-2-25 11:48 AM
因為0201被判斷為8進位了吧
發表人:
daidai 時間: 2009-2-25 12:27 PM
129是201的16進位...因為直接0201拿進去執行出來
許多程設都把0開頭的數值作為16進位..javascript中的eval可能也是..我沒研究@@
以下是日期判斷的function.判斷日期是否大於今天...可以參考看看
稍作修改應該就可以用囉
function check_birthday_ok( year, month, day )
{
var birthday = year + "/" + month + "/" + day;
var today = new Date();
var myday = new Date(birthday);
if( myday > today ){
return false;
} else {
return true;
}
}
要不然後用以下的 string to int ......parseInt()函式轉換看看吧
var yourInt;
yourInt = parseInt(str);
[daidai 在 2009-2-27 02:04 AM 作了最後編輯]
發表人:
陽だまり 時間: 2009-2-25 01:43 PM
引用:
daidai寫到:
129是201的16進位...因為直接0201拿進去執行出來
許多程設都把0開頭的數值作為16進位..javascript中的eval可能也是..我沒研究@@
那我想M$的小算盤應該是故障了
8進位201轉10進位為129
16進位201轉10進位為513
發表人:
daidai 時間: 2009-2-25 05:45 PM
引用:
那我想M$的小算盤應該是故障了
8進位201轉10進位為129
16進位201轉10進位為513
抱歉~看不太懂你的意思...
0201當作16進位輸出為C9
C在16進位中代表12
eval可能只可以輸出數值
所以以12輸出...再加上後面的9..即為129囉
發表人:
陽だまり 時間: 2009-2-25 07:09 PM
引用:
daidai寫到:
抱歉~看不太懂你的意思...
0201當作16進位輸出為C9
C在16進位中代表12
eval可能只可以輸出數值
所以以12輸出...再加上後面的9..即為129囉
那0208在16進位輸出為D0
D在16進位中代表13
也就是說13先輸出,再加上後面的0
也就是130囉
那0201是129
0202用推的來看的話,照理來說是130
那0208也是130
那那那.............
好了,不開玩笑了
實測了一下,只有在某條件達成時
才會是8進位或者daidai兄提到的算法這樣
還是等高手來為小弟解答這樣
發表人:
dayi 時間: 2009-2-25 08:32 PM
引用:
ROACH寫到:
alert(eval(x));
樓主稍微小改一下就行了
alert(eval(x.toString()));
引用:
daidai寫到:
eval可能只可以輸出數值
eval用來組字串也是ok的啊
這位網兄記錯了吧
發表人:
daidai 時間: 2009-2-26 12:08 AM
暈@@...實際將字串"0200"到"0220"輸入....eval(x)答案分別為
"0200" => 128
"0201" => 129
"0202" => 130
"0203" => 131
"0204" => 132
"0205" => 133
"0206" => 134
"0207" => 135
"0208" => 208
"0209" => 209
"0210" => 136
"0211" => 137
"0212" => 138
"0213" => 139
"0214" => 140
"0215" => 141
"0216" => 142
"0217" => 143
"0218" => 218
"0219" => 219
"0220" => 144
字串"0201"使用eval(x.toString())印出的還是129..@@
規則不知道是什麼...不過的確...我上述的方式是有錯誤的=.=(沒實際操作)..拍謝~
發表人:
dayi 時間: 2009-2-26 08:39 PM
引用:
daidai寫到:
字串"0201"使用eval(x.toString())印出的還是129..@@
這個部分我也沒實測
但這樣子的結果真的很奇怪
eval的輸入是string
所以0201變成string之後應該會是"0201"再輸入到eval
理論上來說應該是原本的字串
這真的蠻奇怪的
樓上的人說的很對
儘量不要用eval
雖然eval功能很強
但是也很容易出錯
發表人:
sparrow 時間: 2009-2-27 05:58 PM
使用Regular Expression
function checkdate(){
var x="0228";
var Reg=new RegExp("([0][2]([2][8-9]|[3][0-1]))");
if(x.search(Reg)>=0){
alert("排除輸入的值 "+x);
}else{
alert("輸入正確");
}
}
window.onload=checkdate;
如不考慮輸入字串長度,只要字串內有包含0228、0229、0230、0231的字眼皆會被排除。
當然也可以設定從開頭到第四個字元來比對是否match。
發表人:
ROACH 時間: 2009-2-28 02:06 PM
其實要排除使用者輸入的日期
最好的方法應該是寫個1到12月再依照每月的大月小月
事先丟到陣列裡去推說使用者輸入的日期是否正確.....
哈!!!當初還沒開始動工先怎作
想說先解決2月的問題再說
所以就先緊急上來問的
謝謝大家的幫助~~~
後來初步想法除的可以用aparrow這招以外
也可以這樣作
if ( ( !( x.match(/\D/) == null ) ) || ( x.length != 8 ) )
{
alert("格式錯誤");
return false;
}
var m = new Array();
m[1] = 31;
m[2] = 28;
m[3] = 31;
m[4] = 30;
m[5] = 31;
m[6] = 30;
m[7] = 31;
m[8] = 31;
m[9] = 30;
m[10] = 31;
m[11] = 30;
m[12] = 31;
xx = parseFloat(x.substring(4,6));
dd = parseFloat(x.substring(6,8));
if ( m[xx] < dd )
alert("日期錯誤");
else
alert("日期正確");
}
checkdate("20090230");
至於eval的作法我是看一本javascript語法
裡面說eval可以拿來把字串轉成數字
我才想到說拿eval來試試看!沒想到沒那麼簡單
後來在看其它網站才發現到要用parseFloat
sparrow你這招很厲害喔!我從沒想到還有這個方法
[ROACH 在 2009-2-28 02:59 PM 作了最後編輯]
發表人:
GERRYccc 時間: 2009-2-28 11:31 PM
這樣二月會遇到潤年 2/29 的問題..
可以參考:http://blog.wu-boy.com/2008/04/30/194/ (JQuery產生日曆)
還有參考:http://roseroo.spaces.live.com/B ... .entry?sa=381515159 (日期檢核)
發表人:
Acute 時間: 2009-3-8 04:50 AM
引用:
daidai寫到:
暈@@...實際將字串"0200"到"0220"輸入....eval(x)答案分別為
"0200" => 128
"0201" => 129
"0202" => 130
"0203" => 131
"0204" => 132
"0205" => 133
"0206" => 134
"0207" => 135
"020
8" => 208
"020
9" => 209
"0210" => 136
"0211" => 137
"0212" => 138
"0213" => 139
"0214" => 140
"0215" => 141
"0216" => 142
"0217" => 143
"021
8" => 218
"021
9" => 219
"0220" => 144
字串"0201"使用eval(x.toString())印出的還是129..@@
規則不知道是什麼...不過的確...我上述的方式是有錯誤的=.=(沒實際操作)..拍謝~
其實, 規則很容易抓出來
0###, 以0 為開頭, 會被當作8進位的數字
但是, 如果### 裡面出現8/9, 超過8進位, 所以函式就認定為10進位
所以, 要用這個函式也不困難, 先檢查陣列前方的0, 都刪除, 就不會出錯了 @@
Acute.
發表人:
多多 時間: 2012-5-31 02:52 PM
我今天收到公司一張問題單,也是自串轉日期的錯,
中間有一段就是把字串先轉為數字做組合再去做日期的比對,
我的做法是直接調用 new Number () 即可。
我把程式打在下面,希望有些許幫助:
// 傳入值
// startDate => 097/01/01
// endDate => 101/05/31
function dateCompare (startDate, endDate) {
var start = startDate.split("/");
var end = endDate.split("/");
var sTimeStr =
new Number(start[1]) + "/" +
new Number(start[2]) + "/" +
(new Number(start[0]) + 1911);
var eTimeStr =
new Number(end[1]) + "/" +
new Number(end[2]) + "/" +
(new Number(end[0]) + 1911);
var sTime = (Date.parse(sTimeStr)).valueOf();
var eTime = (Date.parse(eTimeStr)).valueOf();
if(sTime < eTime){
alert('日期正確');
} else {
alert('日期錯誤');
}
}
歡迎光臨 TWed2k (http://twed2k.org/) |
Powered by Discuz! 4.1.0 |