Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Маска для паспортных данных / 4 сообщений из 4, страница 1 из 1
12.04.2013, 11:27
    #38223161
Pulsar_p
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маска для паспортных данных
Кто-нибудь составлял анкету, в которой есть паспортные данные граждан? С российскими паспортами все просто: 99 99 999999, но бывают свидетельства о рождении и старые советские паспорта, там серии уж больно мудрёные, не хотелось бы изобретать велосипед, может есть готовое решение для ввода серии и номера документа (маска, например)?
...
Рейтинг: 0 / 0
12.04.2013, 12:53
    #38223335
AndreTM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маска для паспортных данных
У налоговой в своё время был справочник видов документов, удостоверяющих личность , посмотрите...
...
Рейтинг: 0 / 0
12.04.2013, 15:06
    #38223591
GermanGM
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маска для паспортных данных
Pulsar_p, вот довольно дуракоустойчивый "лисапед" (позволяет вводить серии старых паспортов без переключения раскладки или арабскими цифрами типа 5-ОД и исправляет некоторые огрехи операторов)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
** в LostFocus контрола ввода серии (типа "V-ОД") **
if !empty(this.value)
 local lcStr,s1,s2,lnPos,Arabic
 store [] to s1,s2
 lcStr=UPPER(chrt(allt(this.value),[ ],[]))
 lnPos=at([-],lcStr)
 s1=IIF(lnPos=0,lcStr,left(lcStr,lnPos-1))
 s2=IIF(lnPos=0,[],subs(lcStr,lnPos+1))
 lcStr=s1
 Arabic=ArabicNumeralsOnly(lcStr)
 if !Arabic and chrt(lcStr,[0123456789I],[])==[]
 	lcStr = ToArabic(lcStr)
 	Arabic=.T.
 endif
 do case
  case inlist(m.Passport,[01],[03]) && старый паспорт (m.Passport - 2-значный код вида документа)
  lcStr = ToRoman(lcStr,Arabic)
  if chrtran(lcStr,[I],[])==[].and.len(lcStr)>4
   lcStr=RomanNumber(len(lcStr))
   else
   do case
    case Arabic
    lcStr=RomanNumber(int(val(lcStr)))
    case RomanNumeralsOnly(lcStr)
    lcStr=RomanNumber(ArabicNumber(lcStr)) && Испр.неправильного рим.числа
   endcase
  endif
  this.value=lcStr+IIF(lnPos=0,[],[-]+s2)
  otherwise
  *** ... (c) :)
 endcase
endif
***************************

* добавить в PRG
FUNCTION RomanNumeralsOnly
lparameters pStr
return chrt(pStr,[IVXCM ],[])==[]
FUNCTION ArabicNumeralsOnly
lparameters pStr
return chrt(pStr,[0123456789],[])==[]

FUNCTION  ArabicNumber
PARAMETER RZ
RZ = UPPER(RZ)
RZ = CHRTRAN(RZ,'С1ХМУ -','CIXMV')
PRIVATE Z, X, B1, B2, XX
Z = OCCURS('M',RZ)*1000+OCCURS('D',RZ)*500+OCCURS('XC',RZ)*90+OCCURS('XL',RZ)*40
RZ = STRTRAN(RZ,'XC','')
Z = Z+OCCURS('C',RZ)*100
RZ = STRTRAN(RZ,'XL','')
B2 = 'LXXX'
FOR XX = 4 TO 1 STEP -1
   B2 = LEFT(B2,XX)
   X = OCCURS(B2,RZ)*10*(4+XX)
   IF X>0
      Z = Z+X
      RZ = STRTRAN(RZ,(B2),'')
   ENDIF
ENDFOR
Z = Z+OCCURS('IX',RZ)*9
RZ = STRTRAN(RZ,'IX','')
B2 = 'XXX'
FOR XX = 3 TO 1 STEP -1
   B2 = LEFT(B2,XX)
   X = OCCURS(B2,RZ)*10*XX
   IF X>0
      Z = Z+X
      RZ = STRTRAN(RZ,(B2),'')
   ENDIF
ENDFOR
Z = Z+OCCURS('IV',RZ)*4
RZ = STRTRAN(RZ,'IV','')
Z = Z+OCCURS('V',RZ)*5+OCCURS('I',RZ)
RETURN Z

FUNCTION  RomanNumber
PARAMETER NN
PRIVATE Z, X, XX
IF NN<0
   Z = '-'
   NN = -NN
ELSE
   Z = ''
ENDIF
Z = Z+REPLICATE('M',INT(NN/1000))
X = MOD(NN,1000)
IF X>=500
   Z = Z+'D'
   X = X-500
ENDIF
Z = Z+REPLICATE('C',INT(X/100))
X = MOD(X,100)
IF X>=90
   Z = Z+'XC'
   X = X-90
ENDIF
FOR XX = 3 TO 0 STEP -1
   IF X>=50+XX*10
      Z = Z+'L'+REPLICATE('X',XX)
      X = X-50-XX*10
   ENDIF
ENDFOR
IF X>=40
   Z = Z+'XL'
   X = X-40
ENDIF
FOR XX = 3 TO 1 STEP -1
   IF X>=XX*10
      Z = Z+REPLICATE('X',XX)
      X = X-XX*10
   ENDIF
ENDFOR
IF X=9
   RETURN Z+'IX'
ENDIF
FOR XX = 3 TO 0 STEP -1
   IF X>=5+XX
      Z = Z+'V'+REPLICATE('I',XX)
      X = X-5-XX
   ENDIF
ENDFOR
IF X=4
   RETURN Z+'IV'
ELSE
   RETURN Z+REPLICATE('I',X)
ENDIF

FUNCTION ToRoman
lparameters pcStr,Arabic
pcStr=chrtran(pcStr,[УХМС]+IIF(Arabic,[],[1]),[VXMC]+IIF(Arabic,[],[I]))
pcStr=strtran(pcStr,[Ш],[III])
pcStr=strtran(pcStr,[Щ],[III])
pcStr=strtran(pcStr,[П],[II])
pcStr=strtran(pcStr,[Ц],[II])
return pcStr

FUNCTION ToArabic
lparameters pcStr
*pcStr=chrtran(pcStr,[УХМС]+IIF(Arabic,[],[1]),[VXMC]+IIF(Arabic,[],[I]))
pcStr=strtran(pcStr,[Ш],[111])
pcStr=strtran(pcStr,[Щ],[111])
pcStr=strtran(pcStr,[П],[11])
pcStr=strtran(pcStr,[Ц],[11])
pcStr=strtran(pcStr,[I],[1])
return pcStr
...
Рейтинг: 0 / 0
13.04.2013, 06:43
    #38224217
Pulsar_p
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Маска для паспортных данных
Ребята, спасибо, буду разбираться.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Маска для паспортных данных / 4 сообщений из 4, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]