powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Маска для паспортных данных
4 сообщений из 4, страница 1 из 1
Маска для паспортных данных
    #38223161
Pulsar_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-нибудь составлял анкету, в которой есть паспортные данные граждан? С российскими паспортами все просто: 99 99 999999, но бывают свидетельства о рождении и старые советские паспорта, там серии уж больно мудрёные, не хотелось бы изобретать велосипед, может есть готовое решение для ввода серии и номера документа (маска, например)?
...
Рейтинг: 0 / 0
Маска для паспортных данных
    #38223335
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У налоговой в своё время был справочник видов документов, удостоверяющих личность , посмотрите...
...
Рейтинг: 0 / 0
Маска для паспортных данных
    #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
Маска для паспортных данных
    #38224217
Pulsar_p
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребята, спасибо, буду разбираться.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Маска для паспортных данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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