全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1686
推到 Plurk!
推到 Facebook!

地址字串:數字+中文字串如何只取中文

答題得分者是:it1506
喬狼
一般會員


發表:2
回覆:3
積分:1
註冊:2010-08-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2012-03-12 14:21:44 IP:220.130.xxx.xxx 訂閱
這是一個轉會員資料的程式,在測拆地址時的問題,
我的規則是先拆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時能精準選到我要截的字串就好^^"
編輯記錄
喬狼 重新編輯於 2012-03-12 00:23:00, 註解 無‧
喬狼 重新編輯於 2012-03-12 00:28:30, 註解 無‧
喬狼 重新編輯於 2012-03-12 00:30:27, 註解 程式碼區塊怎麼會自動產生HTML語法="=‧
喬狼 重新編輯於 2012-03-12 00:32:56, 註解 補充SC, SD, SR宣告語法‧
it1506
初階會員


發表:30
回覆:83
積分:47
註冊:2011-02-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2012-03-23 15:30:41 IP:59.120.xxx.xxx 未訂閱
 我覺得
你要不要直接用欄位區分就行了
例如 A欄位只能寫數字...
就不會有這問題了

喬狼
一般會員


發表:2
回覆:3
積分:1
註冊:2010-08-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2012-03-23 18:26:06 IP:220.130.xxx.xxx 訂閱
我們的系統設計是郵區、城市、街道地址拆三個欄位, 
這拆地址是針對客戶為了網路商城訂單匯到EXCEL、再從EXCEL匯到ERP用的,
另外也有一般非網路商城,即自有網路商店的客戶訂單轉檔,

因為自有網路商店一般介面都可以設計欄位只吃某種型別,轉檔就不用拆,
但網路商城如Yahoo或PCHome後台轉出的都是併在一起,必須如此設計>"<
===================引 用 it1506 文 章===================
我覺得
你要不要直接用欄位區分就行了
例如 A欄位只能寫數字...
就不會有這問題了

編輯記錄
喬狼 重新編輯於 2012-03-23 04:26:29, 註解 無‧
it1506
初階會員


發表:30
回覆:83
積分:47
註冊:2011-02-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2012-03-26 08:38:55 IP:59.120.xxx.xxx 未訂閱
用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欄位只能寫數字...
就不會有這問題了

編輯記錄
it1506 重新編輯於 2012-03-25 20:45:21, 註解 無‧
it1506 重新編輯於 2012-03-25 20:46:07, 註解 無‧
系統時間:2017-10-19 5:57:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!