地址字串:數字+中文字串如何只取中文 |
答題得分者是:it1506
|
喬狼
一般會員 ![]() ![]() 發表:2 回覆:3 積分:1 註冊:2010-08-25 發送簡訊給我 |
這是一個轉會員資料的程式,在測拆地址時的問題,
我的規則是先拆ZIP code>再拆縣市>原地址排除前面拆的縣市,再拆市區鎮鄉(因為會有像新北市新店市這種同時出現兩個市的) ZIP的拆法再分成拆出3碼就跳出,否則拆到出現「巷弄號樓」為止,沒ZIP則該欄位為空, 規則說完了...進入正題, 例如地址是106台北市大安區瑞安街120巷3弄3號2樓,或是台北市106大安區瑞安(略) 測到拆台北市時,會被拆成'106台北'#$A5,用Pos找'市'回傳為8, 懷疑是'市'佔了8和9兩個位置,但只Copy到第8個位置緣故, 宣告找字串用的常數: [code delphi] const SC: array [0..1] of string = ('縣', '市'); SD: array [0..3] of string = ('市', '區', '鎮', '鄉'); SR: array [0..4] of string = ('縣', '市', '區', '鎮', '鄉'); [/code] 拆ZIP其中一小段語法: [code delphi] // (A).無郵區,拆郵區 sZIP := Copy(sZIP, 1, 3); if (sZIP = '') then begin for i := 1 to Length(sAddr) do begin if sAddr[i] in ['0'..'9'] then sZIP := sZIP sAddr[i]; if (Length(sZIP) >= 3) then //判斷郵區滿三碼或數值後是否有巷弄號樓,有則不視為郵區 Break else begin if IsDBCSLeadByte(Byte(sAddr[i])) then begin if (Pos(sAddr[i 1], '巷弄號樓') <> 0) then Break; end else begin if (Pos(sAddr[i 1], '巷弄號樓') <> 0) then Break; end; end; end; end; [/code] 拆市區一小段語法: [code delphi] for i := 0 to Length(sAddr) - 1 do //先拆縣市(SC) begin if (Pos(SC[i], sAddr) <> 0) then //先找縣再找市 begin if IsDBCSLeadByte(Byte(sAddr[Pos(SC[i], sAddr)])) then sCity := Copy(sAddr, 1, Pos(SC[i], sAddr) 1) else sCity := Copy(sAddr, 1, Pos(SC[i], sAddr)); if (Trim(sCity) <> '') then //再拆郵區(SD),從市找到鄉,沒有就逐一往右找 begin //(略) end; end else Continue; end; [/code] 以上語法我用此段程式去跑,郵遞區號106皆丟出數字, 台北...瑞安街之間卻都是中文、數字交互顯示, [code delphi] if IsDBCSLeadByte(Byte(sAddr[i])) then showmessage('中文') else showmessage('數字'); [/code] 如果取城市那一塊我不用 IsDBCSLeadByte而直接用: [code delphi] sCity := Copy(sAddr, 1, Pos(SC[i], sAddr));[/code] 就會變成 '106台北'#$A5 爬文用過Length(sAddr[i]) >= 2也沒用,一律都被視為文字( http://delphi.ktop.com.tw/board.php?cid=30&fid=70&tid=20191 ) 我要的很基本,數字很簡單,sAddr[i] in ['0'..'9']都是1 byte所以能比對到, 但是偵測到該字元為文字,在Copy或Pos時能精準選到我要截的字串就好^^" |
it1506
初階會員 ![]() ![]() 發表:33 回覆:89 積分:49 註冊:2011-02-16 發送簡訊給我 |
|
喬狼
一般會員 ![]() ![]() 發表:2 回覆:3 積分:1 註冊:2010-08-25 發送簡訊給我 |
|
it1506
初階會員 ![]() ![]() 發表:33 回覆:89 積分:49 註冊:2011-02-16 發送簡訊給我 |
用try except 來做 先把字串拆開, 然後用 strtoint(str);如果轉不過去就會跳到except , 就知道是中文字 最後再整理起來 兩個做法基本上是一樣的 是有點麻煩 @@ 參考看看 procedure TForm1.btn1Click(Sender: TObject); var zipCode,tempStr:string; i:Integer; begin //先找郵遞區號 ,ex: 106台北市大安區 or 台北市106大安區 try tempStr:=''; for I := 1 to Length(edt1.Text) do begin if isNum(copy(edt1.Text,i,1)) then begin tempStr:=tempStr copy(edt1.Text,i,1); //遇到路,街等...就跳出 end; if (Copy(edt1.Text,i,1)='路') or (Copy(edt1.Text,i,1)='街') then begin raise Exception.Create('@@@@@@@@@@'); end; end; except on e:Exception do begin //第一次跳出是郵遞區號 zipCode:=tempStr; end; end; ShowMessage(zipCode); end; function TForm1.isNum(s:string) :Boolean; //是否為數字, 一次一個字 begin try if StrToInt(s)<10 then begin Result:=true; end; except on e:Exception do begin result:=False; end; end; end; ===================引 用 喬狼 文 章=================== 我們的系統設計是郵區、城市、街道地址拆三個欄位, 這拆地址是針對客戶為了網路商城訂單匯到EXCEL、再從EXCEL匯到ERP用的, 另外也有一般非網路商城,即自有網路商店的客戶訂單轉檔, 因為自有網路商店一般介面都可以設計欄位只吃某種型別,轉檔就不用拆, 但網路商城如Yahoo或PCHome後台轉出的都是併在一起,必須如此設計>"< ===================引 用 it1506 文 章=================== 我覺得 你要不要直接用欄位區分就行了 例如 A欄位只能寫數字... 就不會有這問題了 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |