import unicodedata
import adglobal as g
import adclass
import os
import sys
import pdb
def zhconv(str1): # 住所入力中に郵便番号、電話番号を全角で入れてしまうので、全角数字を半角数字に変換する。住所中の全角数字も半角数字になる。
size = len(str1)
s = list(str1) # 文字列内を変更できないので、一旦リストに変換
str2 = [""] * size
for k in range(size):
c1 = s[k]
if c1 in g.z:
str2[k] = g.h[g.z.index(c1)] # 全角数字を半角数字に置き換える。
else:
str2[k] = s[k] # 全角数字以外はそのまま
return ''.join(str2) # リストを文字列に戻す。
def setdir():
g.org_path = os.getcwd() # org_path:カレンとディレクトリ
os.chdir(g.ad_path) # カレント・ディレクトリをad_pathに設定
def restoredir():
os.chdir(g.org_path)
def setbook(ad_book): # 住所録名ad_bookに基づいて住所録のパス文字列を作って返す。
book_path = ad_path + "\\" + ad_book + ".csv" # ad_book:住所録のパス名
return book_path
def name_check(str1): # 名前文字列の確認
size = len(str1)
if size == 0 or size > 20:
return False # 長さ20字以上の名前は不可ということにする。
return True
def postcode_check(str1): # 郵便番号チェック
size = len(str1)
if size != 8: # 郵便番号文字列の長さは8文字限定
return False
c1 = str1.count('-')
if c1 == 1: # ハイフン個数は1に限定
m = str1.split('-') # ハイフンで2つの文字列に分けてリストに入れる。
if len(m) == 2:
if len(m[0]) == 3 and len(m[1]) == 4: # 最初の文字列の長さは3、2番目の文字列の長さは4
if m[0].isdecimal() and m[1].isdecimal(): # 文字列は数字でできているか?
return True # correct postcode
return False # illegal postcode
def address_check(str1): # 住所文字列の確認(長さが0かどうかしか見ていない)
size = len(str1)
if size == 0:
return False
return True
def telno_check(str1): # 電話番号の確認
size = len(str1)
if size == 0:
return False
if str1[0] != '0': # '0'から始まらないときは、市外局番が省力されている。
c1 = str1.count('-')
if c1 == 1: # ハイフンが1個のときは、m[1]は4文字のはず
m = str.split('-')
if len(m[1]) == 4:
if m[0].isdecimal() and m[1].isdecimal():
return True
if c1 == 0:
if str1.isdecimal():
return True
else:
return False # 電話番号の最初の数字が'0'でない場合(市外局番なし)は、ハイフンが2個になることはない。
c1 = str1.count('-') # '0'から始まるときは、市外局番から始まっている
if c1 == 2: # ハイフンが2個入っている。
m = str1.split('-') # ハイフンで分割すると3つの文字列ができる。
if len(m[2]) == 4: # m[2]は4文字のはず
if m[0].isdecimal() and m[1].isdecimal() and m[2].isdecimal():
return True
return False
elif c1 == 1: # ハイフンが1個のとき
m = str1.split('-') # ハイフンで分割すると2つの文字列ができる。
if len(m[1]) == 4: # m[1]は4文字のはず
if m[0].isdecimal() and m[1].isdecimal():
return True
return False
elif c1 == 0: # ハイフンが入っていない。
if str1.isdecimal(): # このときは、文字数を限定しない。
return True
return False # str1は電話番号ではない。
def mail_check(str1): # メール・アドレスのチェック
size = len(str1)
if size == 0:
return False
m = list(str1) # 文字列を1文字ずつのリストに分解する。
atc = 0 # atc:'@'を数える。
prc = 0 # prc:'.'を数える。但し、通常文字でクリアする。
cnt = 0 # cnt:文字数を数える。
for c in m:
u = ord(c) # 文字のUTF-8コード(shift-JISと同じだが)を取り出す
if (u > 47 and u < 58) or (u > 64 and u < 91) or (u > 96 and u < 123) or u == 95:
cnt += 1 # 通常文字は文字数をカウント
prc = 0 # '.'の連続検知のため通常文字で'.'の数を0にしておく
elif u == 64: # '@'検出
if atc > 0:
return False # 2個目の'@'はエラー
else:
if prc > 0:
return False # '.'直後の'@'はエラー
atc += 1
cnt += 1
elif u == 46: # '.'検出
if prc > 0:
return False # '.'の連続はエラー
prc += 1
cnt += 1
else:
return False # 通常文字の他"@._"以外の文字は使えない
if atc == 0:
return False # 必ず'@'が1個入るはず。入らなければエラー
if cnt > 30: # mail文字列の長さは30文字まで
return False # 30文字を超えていたらエラー
return True
def eachappend(ba, d): # 項目毎のリストに追加する。ba:項目毎リスト。p:1人分データ
p = d.p
for i, da in enumerate(ba):
da.append(p[i])
def len2(str): # 半角全角を考慮した文字列幅の取得
cnt = 0
for c1 in str:
if unicodedata.east_asian_width(c1) in "FWA": # 2バイト系文字か?
cnt += 2
else:
cnt += 1
return cnt
def makestr(n, align, w, d, sep): # n:表示項目数, align:左右寄せ, w:表示幅, d:表示文字列
str1 = ""
for i in range(n): # i:項目番号
w1 = w[i] # 項目幅
for c1 in d[i]:
str1 = str1 + c1 # 幅の限界を超えてもどこまでも書き込む
if unicodedata.east_asian_width(c1) in "FWA": # 2バイト系文字か?
w1 -= 2
else:
w1 -= 1
if w1 > 0:
if align[i] == "l": # 左寄せ
str1 = str1 + ' ' * w1 # 表示幅の不足する分を半角ブランクで埋める
else: # 右寄せ
str1 = ' ' * w1 + str1
str1 = str1 + sep
return str1
check_func = [name_check, postcode_check, address_check, telno_check, mail_check] # check関数のリスト