RSS   



  可打印版本 | 推薦給朋友 | 訂閱主題 | 收藏主題 | 純文字版  


 


 
主題: [其他] [求助]超怪的字串轉數字的問題Javascript   字型大小:||| 
ROACH
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30
減肥中!請勿餵食

十週年紀念徽章(四級)  

 . 積分: 15118
 . 精華: 14
 . 文章: 11766
 . 收花: 140844 支
 . 送花: 6005 支
 . 比例: 0.04
 . 在線: 8869 小時
 . 瀏覽: 85616 頁
 . 註冊: 7973
 . 失蹤: 3
 . 鄉下地方
#1 : 2009-2-25 10:06 AM     只看本作者 引言回覆

想問一下一個簡單的換算

輸入字串0201 理論上用eval轉成數字時應該會變成201
可是它卻輸出129
為什麼會這樣呢???

我程式是想排除使用者輸入的日期 20090228~20090231
所以我會擷取後面的月+日 我用 substring(4,8)

  function checkdate(x)
  {
    alert(x);
    alert(eval(x));
  }
  
checkdate("0201");



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
陽だまり
白銀驢友
等級: 15等級: 15等級: 15等級: 15等級: 15
ささらの可愛さは異常

 . 積分: 1330
 . 精華: 1
 . 文章: 3159
 . 收花: 10387 支
 . 送花: 26639 支
 . 比例: 2.56
 . 在線: 4508 小時
 . 瀏覽: 30308 頁
 . 註冊: 7199
 . 失蹤: 1206
 . 星の彼方
#2 : 2009-2-25 11:48 AM     只看本作者 引言回覆

因為0201被判斷為8進位了吧


[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
daidai
鐵驢友〔中級〕
等級: 5等級: 5


 . 積分: 51
 . 文章: 80
 . 收花: 325 支
 . 送花: 166 支
 . 比例: 0.51
 . 在線: 1631 小時
 . 瀏覽: 13352 頁
 . 註冊: 7087
 . 失蹤: 580
#3 : 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 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
陽だまり
白銀驢友
等級: 15等級: 15等級: 15等級: 15等級: 15
ささらの可愛さは異常

 . 積分: 1330
 . 精華: 1
 . 文章: 3159
 . 收花: 10387 支
 . 送花: 26639 支
 . 比例: 2.56
 . 在線: 4508 小時
 . 瀏覽: 30308 頁
 . 註冊: 7199
 . 失蹤: 1206
 . 星の彼方
#4 : 2009-2-25 01:43 PM     只看本作者 引言回覆


引用:
daidai寫到:
129是201的16進位...因為直接0201拿進去執行出來
許多程設都把0開頭的數值作為16進位..javascript中的eval可能也是..我沒研究@@

那我想M$的小算盤應該是故障了
8進位201轉10進位為129
16進位201轉10進位為513



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
daidai
鐵驢友〔中級〕
等級: 5等級: 5


 . 積分: 51
 . 文章: 80
 . 收花: 325 支
 . 送花: 166 支
 . 比例: 0.51
 . 在線: 1631 小時
 . 瀏覽: 13352 頁
 . 註冊: 7087
 . 失蹤: 580
#5 : 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囉



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
陽だまり
白銀驢友
等級: 15等級: 15等級: 15等級: 15等級: 15
ささらの可愛さは異常

 . 積分: 1330
 . 精華: 1
 . 文章: 3159
 . 收花: 10387 支
 . 送花: 26639 支
 . 比例: 2.56
 . 在線: 4508 小時
 . 瀏覽: 30308 頁
 . 註冊: 7199
 . 失蹤: 1206
 . 星の彼方
#6 : 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兄提到的算法這樣

還是等高手來為小弟解答這樣



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
dayi
開墾隊隊員
等級: 14等級: 14等級: 14等級: 14
ZeroX

十週年紀念徽章(五級)  

今日心情

 . 積分: 935
 . 文章: 2060
 . 收花: 7802 支
 . 送花: 2401 支
 . 比例: 0.31
 . 在線: 2821 小時
 . 瀏覽: 61582 頁
 . 註冊: 6892
 . 失蹤: 991
 . ZeroX
#7 : 2009-2-25 08:32 PM     只看本作者 引言回覆


引用:
ROACH寫到:
    alert(eval(x));


樓主稍微小改一下就行了
alert(eval(x.toString()));



引用:
daidai寫到:
eval可能只可以輸出數值


eval用來組字串也是ok的啊
這位網兄記錯了吧



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
daidai
鐵驢友〔中級〕
等級: 5等級: 5


 . 積分: 51
 . 文章: 80
 . 收花: 325 支
 . 送花: 166 支
 . 比例: 0.51
 . 在線: 1631 小時
 . 瀏覽: 13352 頁
 . 註冊: 7087
 . 失蹤: 580
#8 : 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..@@
規則不知道是什麼...不過的確...我上述的方式是有錯誤的=.=(沒實際操作)..拍謝~



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
dayi
開墾隊隊員
等級: 14等級: 14等級: 14等級: 14
ZeroX

十週年紀念徽章(五級)  

今日心情

 . 積分: 935
 . 文章: 2060
 . 收花: 7802 支
 . 送花: 2401 支
 . 比例: 0.31
 . 在線: 2821 小時
 . 瀏覽: 61582 頁
 . 註冊: 6892
 . 失蹤: 991
 . ZeroX
#9 : 2009-2-26 08:39 PM     只看本作者 引言回覆


引用:
daidai寫到:
字串"0201"使用eval(x.toString())印出的還是129..@@


這個部分我也沒實測
但這樣子的結果真的很奇怪
eval的輸入是string
所以0201變成string之後應該會是"0201"再輸入到eval
理論上來說應該是原本的字串
這真的蠻奇怪的

樓上的人說的很對
儘量不要用eval
雖然eval功能很強
但是也很容易出錯



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
sparrow
青銅驢友
等級: 11等級: 11等級: 11等級: 11
整個就是悶

今日心情

 . 積分: 207
 . 文章: 1195
 . 收花: 1221 支
 . 送花: 1787 支
 . 比例: 1.46
 . 在線: 982 小時
 . 瀏覽: 37606 頁
 . 註冊: 7180
 . 失蹤: 58
#10 : 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。



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
ROACH
版主
等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30等級: 30
減肥中!請勿餵食

十週年紀念徽章(四級)  

 . 積分: 15118
 . 精華: 14
 . 文章: 11766
 . 收花: 140844 支
 . 送花: 6005 支
 . 比例: 0.04
 . 在線: 8869 小時
 . 瀏覽: 85616 頁
 . 註冊: 7973
 . 失蹤: 3
 . 鄉下地方
#11 : 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 作了最後編輯]



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  訪問主頁  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
GERRYccc
名譽版主
等級: 8等級: 8
凹~~嗚~~^^y

今日心情

 . 積分: 103
 . 文章: 597
 . 收花: 497 支
 . 送花: 754 支
 . 比例: 1.52
 . 在線: 446 小時
 . 瀏覽: 7391 頁
 . 註冊: 7974
 . 失蹤: 127
 . ~@.@~ TWed2k 星球
#12 : 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 (日期檢核)



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
Acute
論壇第一大毒王
等級: 18等級: 18等級: 18等級: 18等級: 18
論壇第一小神童

 . 積分: 3281
 . 精華: 8
 . 文章: 11574
 . 收花: 14037 支
 . 送花: 3260 支
 . 比例: 0.23
 . 在線: 323 小時
 . 瀏覽: 2250 頁
 . 註冊: 7978
 . 失蹤: 5330
#13 : 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
"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..@@
規則不知道是什麼...不過的確...我上述的方式是有錯誤的=.=(沒實際操作)..拍謝~


其實, 規則很容易抓出來
0###, 以0 為開頭, 會被當作8進位的數字
但是, 如果### 裡面出現8/9, 超過8進位, 所以函式就認定為10進位
所以, 要用這個函式也不困難, 先檢查陣列前方的0, 都刪除, 就不會出錯了 @@

Acute.



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記
多多
銀驢友〔初級〕
等級: 12等級: 12等級: 12
大日殿即導師‧善法天子

 . 積分: 453
 . 文章: 220
 . 收花: 3924 支
 . 送花: 4876 支
 . 比例: 1.24
 . 在線: 1191 小時
 . 瀏覽: 21891 頁
 . 註冊: 6805
 . 失蹤: 73
#14 : 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('日期錯誤');
    }
}



[如果你喜歡本文章,就按本文章之鮮花~送花給作者吧,你的支持就是別人的動力來源]
本文連接  
檢閱個人資料  發私人訊息  Blog  快速回覆 新增/修改 爬文標記

   

快速回覆
表情符號

更多 Smilies

字型大小 : |||      [完成後可按 Ctrl+Enter 發佈]        

溫馨提示:本區開放遊客瀏覽。
選項:
關閉 URL 識別    關閉 表情符號    關閉 Discuz! 代碼    使用個人簽名    接收新回覆信件通知
發表時自動複製內容   [立即複製] (IE only)


 



所在時區為 GMT+8, 現在時間是 2024-3-29 05:52 PM
清除 Cookies - 連絡我們 - TWed2k © 2001-2046 - 純文字版 - 說明
Discuz! 0.1 | Processed in 0.032384 second(s), 7 queries , Qzip disabled