:: Visual Foxpro, Foxpro for DOS
Как проверить число, принятое из Excel, на принадлежность к целым числам?
seg856

Сообщений: 272
Дата регистрации: 23.09.2010
Как проверить число, принятое из Excel, на принадлежность к целым числам?
Ratings: 0 negative/0 positive
Re: Как проверить число, принятое из Excel, на принадлежность к целым числам?
akvvohinc

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
А принятое из Excel целое число - это какое-то особое целое число?
Или иначе - зачем нам знать, каким образом в переменную Фокса попало некоторое значение?
Ratings: 0 negative/1 positive
Re: Как проверить число, принятое из Excel, на принадлежность к целым числам?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
А зачем это делать? В экселе может отображаться далеко не то же самое что и на самом деле хранится в ячейке (впрочем, в фоксе тоже).
И какая тебе разница, хранится физически в экселе число 123.0000000000001, или "ровно 123"?
Кстати, в ячейке запросто может хранится и "число как текст" - это по-твоему как должно классифицироваться, как число (неважно уже даже целое или нет), или как НЕ число? Если для пользователя там "чёрным по белому 123 написано"
Ну и не забываем что даты в экселе тоже хранятся как числа (как число дней от опорной даты, с дробной частью показывающей время).

В зависимости от того как именно "принимаются" данные, они уже могут быть и округлены и, наоборот, потерять точность и превратится в какие-то малопонятные 122.99999999999


------------------
WBR, Igor
Ratings: 0 negative/1 positive
Re: Как проверить число, принятое из Excel, на принадлежность к целым числам?
AndyNigmatec

Сообщений: 1550
Откуда: Волгоград
Дата регистрации: 28.06.2015
Не претендуя на истину, но обычно забирая что-либо из внешнего (напр. эксель) источника мы же ожидаем данные определенного типа и соотв. ежели не тип "не тот" то приводим к требуемому, у вас иначе?
Ratings: 0 negative/0 positive
Re: Как проверить число, принятое из Excel, на принадлежность к целым числам?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Я вообще всегда встречаю (если первый раз обрабатываю файл из нового источника) символьными полями примерно с двукратным запасом по числу полей. Поля символьные размером да хоть по 254 символа, если, конечно, файл excel не слишком уж большой по размеру. Сначала сохраняю файл excel в формате "текст с разделителями табуляции". После APPEND FROM изучаю все аномалии исходного файла. После такого изучения становится ясно, чего можно ожидать от исходного файла. Потом уже можно откорректировать файл, в который будет приниматься инфа. Но даже и в этом случае удобно все принять в текстовые поля, а потом уже перегнать в итоговую таблицу.



Исправлено 1 раз(а). Последнее : Simple777, 05.06.18 20:38
Ratings: 0 negative/0 positive
Re: Как проверить число, принятое из Excel, на принадлежность к целым числам?
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Для VFP импорт через текстовый файл будет худшим вариантом по сравнению с прямым доступом к объектной модели excel, и даже не совсем удобному доступу через ODBC драйвер.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Как проверить число, принятое из Excel, на принадлежность к целым числам?
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Ну, речь, конечно была не о VFP.

Ясное дело, что надо использовать возможности, предоставляемые VFP. И могли бы быть такие возможности и в FPD, но не сделали.
Ratings: 0 negative/0 positive
Re: Как проверить число, принятое из Excel, на принадлежность к целым числам?
of63
Автор

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Не претендуя на истину, но обычно забирая что-либо из внешнего (напр. эксель) источника мы же ожидаем данные определенного типа и соотв. ежели не тип "не тот" то приводим к требуемому, у вас иначе?

Именно так. У нас есть "предзнания" о типе данных, и этим мы пользуемся при приеме. Отсюда вот такая странная странная программа по преобразованию типов:
Часть текста скрыта
************************************************************************************************************************************************************************************
* Возвращает параметр (1) в типе (2С)
* При вызове с одним параметром возврашает (1) в интуитивно похожем типе (десериализация. Сама сериализация производится вызовом VALTOTIP(значение, "C") или "S")
* выполняется для типа (1С)
* Особые случаи:
* C, "ДДММГГ(ГГ)" ("ДД.ММ.ГГ(ГГ)") - интерпретация C как даты, возвр дату
* D, "DDMMYYYY" [, "MY"] - возвращает строку даты в указанном формате
* допускается указать одну букву D M Y - тогда день(мес)(год) будет представлен одним символом
* 3-ий параметр - транслируемые буквы в формате, умолчание=DMYdmyДМГдмг
* C, D - интерпретирует C как дату, формат которой представлен D
* день - вес дня в C
* месяц - вес месяца в C
* если год>=1900 то в C присутствуют разделители (точки)
* последняя цифра года - вес (порядок) в C
* предпоследняя цифра года - длина года в C
* S - возвращает в текстовом виде, обрабленном кавычками, для создания EVAL-выражений
* I - интерпретируется как "N" (для совместимостью с макрострокой CREATE CURSOR). Целочисленность пока не поддерживается...
************************************************************************************************************************************************************************************
* Внимание! Вызов с ОДНИМ параметром используется для интерпетации (десериализации значения) строки, т.е. превращение его в значения в подразумеваемом типе в SetGetStringValue !
* Именно в ней и происходит интерпретация {NN...} как даты, 'ccc' как строки, 0b0101001101 как числа (в бинарной записи) и др.
************************************************************************************************************************************************************************************
FUNCTION VALTOTIP
LPARAMETERS m.parX, m.parTIP, m.parDOP
PRIVATE ALL LIKE ?
m.p = PCOUNT()
m.t = ICASE(m.p<=1, " ",;
VARTYPE(m.parTIP)="C" .AND. INLIST(m.parTIP+" ","CT ","ST "), LOWER(LEFT(m.parTIP,1)),;
VARTYPE(m.parTIP)="C" .AND. (LEN(m.parTIP)>=2 .OR. m.p>=3), "*C",;
VARTYPE(m.parTIP)="C", UPPER(m.parTIP),;
"*"+VARTYPE(m.parTIP))
#DEFINE Самовызов VALTOTIP && в основном для преобразований даты требуется...
#DEFINE символыДМГ "ДдDdМмMmГгYy"
#DEFINE символыДМГразделители ТЧК + "-" + "/"
m.s = VARTYPE(m.parX) + IIF(m.t="S", STRTRAN(m.t,"S","C",1,1,1+2), m.t)
DO CASE
CASE m.s="C " && вернуть значение строки в подразумеваемом типе. Десериализация, т.е. этой C-строкой пытались передать некоторое значение не C-типа. . Используется в SetGetStringValue() !
m.x = ALLTRIM(m.parX)
DO CASE
CASE LIKE( "["+like0+ "]", m.x) .OR.; && что-то обрамленое кавычками (апострафами, кв. скобками) - это строка символов
LIKE(оКВЧ+like0+оКВЧ, m.x) .OR.;
LIKE( КВЧ+like0+ КВЧ, m.x)
TRY && бывает, что это хорошее выражение. Таже бывает, что строка содержит вкрапления, типа "+CHR(13)+", поэтому считываем строку через EVAL...
m.r = EVALUATE(m.x)
CATCH && бывает, что это плохое выражение (например, слишком длинное... >255)
* WAIT LEFT(m.x, 250) WINDOW nowait
m.r = SUBSTR(m.x,2,LEN(m.x)-2) && если возникла ошибка в EVAL, то вернем просто содержимое между кавычек
ENDTRY
RETURN m.r
CASE LIKE("{^"+like0+"}", m.x) .OR.; && фокс-представление даты, внутрипрограммное: {^ГГГГ-ММ-ДД}
LIKE("{" +like0+"}", m.x) && дата, примерно формата ДД.ММ.ГГГГ, или похожего, и подходящего под текущий формат SET DATE [german], или форматы DMY, YMD, MDY...
m.v = "T"$UPPER(m.x) .OR.;
"Z"$UPPER(m.x)
IF EMPTY(CHRTRAN(m.x, "{}^"+символыДМГразделители, ""))
RETURN {}
ENDIF
RETURN Самовызов(m.x, IIF(m.v, "T", "D")) && RETURN EVALUATE(m.x)
CASE UPPER(m.x)==".T."
RETURN .T.
CASE UPPER(m.x)==".F."
RETURN .F.
CASE UPPER(m.x)==".NULL."
RETURN .NULL.
CASE INLIST(m.x,"0x","0h") .AND. !EMPTY(SUBSTR(m.x,3)) .AND. EMPTY(CHRTRAN(SUBSTR(m.x,3),"0123456789ABCDEF","")) && HEX-число, BIN-строка (порядок байтов - как в фоксе)
RETURN EVALUATE(m.x)
CASE INLIST(m.x,"0b") .AND. !EMPTY(SUBSTR(m.x,3)) .AND. EMPTY(CHRTRAN(SUBSTR(m.x,3),"01","")) && битовое, бинарное представление, в фоксе такого нет (первые биты - младшие!)
RETURN BITSETsv(0, SUBSTR(m.x,3))
CASE IsSTRdig(m.x) && это символьное представление числа
#DEFINE maxЗнаковDouble 15 && было 12. Предел точности для фокса - 15 значащих дес. разрядов. Сравни 10^16=10^16-1 (.T.), и на 15 разрядах - правильно (.F.)
m.t = OCCURS(ТЧК,m.x)
IF !m.t=0
m.x = RTRIM(m.x, 1, "0") && бывает, что дробное число записано с большим количеством "0" в конце
IF RIGHT(m.x,1)=ТЧК
m.x = RTRIM(m.x, 1, ТЧК)
m.t = 0
ENDIF
ENDIF
IF (m.t=0 .AND. LEN(m.x)<=maxЗнаковDouble) .OR.;
(m.t=1 .AND. LEN(m.x)<=maxЗнаковDouble+1)
IF !m.t=0
m.t = LEN(m.x) - RAT(".",m.x) && знаков после точки, для ROUND
ENDIF
RETURN ROUND(VAL(m.x),m.t) && О дробных числах в фокс см. в комментариях к iINT, и forum.foxclub.ru
ENDIF
CASE EMPTY(CHRTRAN(m.x,".+-*/^()0123456789","")) .AND.; && это математическое выражение (формула), состояшее только из цифр и матем. операторов. Однако, дата - 05/12/2017 - это не формула!
!EMPTY(CHRTRAN(m.x,".+-*/^()","")) .AND.;
TYPE(m.x)="N"
RETURN EVALUATE(m.x)
ENDCASE
RETURN m.x && вернуть значение строки в подразумеваемом типе
* см. также SET STRICTDATE TO 2 - при невозможности интерпретации строки как даты приводит к ERROR 2033
CASE INLIST(m.s, "C*C", "N*C") .AND. LEN(m.parTIP)>=6 .AND. EMPTY(CHRTRAN(m.parTIP, символыДМГразделители+символыДМГ,"")) && интерпретация C/N как ДДММГГ(ГГ) (ДД.ММ.ГГ(ГГ), ГГГГ-ММ-ДД, ДД/ММ/ГГГГ)
m.x = m.parX
IF VARTYPE(m.x)="N" && если на входе не строка, а число, то цифры числа интерпретируем согласно маске
m.x = TRANSFORM(m.x, CHRTRAN(m.parTIP, символыДМГразделители+символыДМГ, REPLICATE(ЗПТ,LEN(символыДМГразделители))+; && ТЧК-->ЗПТ, ДМГ-->999, например: ГГГГММДД
REPLICATE("9",LEN(символыДМГ))))
m.x = CHRTRAN(m.x, ЗПТ, ТЧК)
ENDIF
STORE "" TO m.a,; && день
m.b,; && месяц
m.y && год
FOR m.i=1 TO LEN(m.parTIP) && перебираем символы форматной строки (и соотв. входные символы)
m.f = SUBSTR(m.parTIP,m.i,1) && форматный символ (маска)
m.s = SUBSTR(m.x, m.i,1) && символ, соотв. форматному символу, в интерпретируемой строке
DO CASE
CASE INLIST(m.f,"Д","D") && принят день
m.a = m.a+m.s
CASE INLIST(m.f,"М","M") && принят месяц
m.b = m.b+m.s
CASE INLIST(m.f,"Г","Y") && принят год
m.y = m.y+m.s
OTHERWISE && остальные символы
ENDCASE
ENDFOR && перебирали символы форматной строки (и соотв. входные символы)
IF !EMPTY(m.a) .AND. !EMPTY(m.b) .AND. !EMPTY(m.y) .AND.;
BETWEEN(VAL(m.a), 1, 31) .AND. BETWEEN(VAL(m.b), 1, 12)
m.y = ICASE(LEN(m.y)=1 .AND. VAL(m.y)<=YEAR(DATE())%10, LEFT(STR(YEAR(DATE()),4),3),; && дополним недостающие старшие цифры года, если год задан 1-2 цифрами
LEN(m.y)=2 .AND. VAL(m.y)<=YEAR(DATE())%100, LEFT(STR(YEAR(DATE()),4),2),;
"") + m.y
IF BETWEEN(VAL(m.y), 100,9999)
RETURN DATE(VAL(m.y), VAL(m.b), VAL(m.a)) && CTOD(m.a+"."+m.b+"."+m.y)
ENDIF
ENDIF
RETURN {} && тип - строка вида: ДДММГГ(ГГ)
CASE SUBSTR(m.s,1,1)=SUBSTR(m.s,2,1) .OR.; && не надо преобразовывать
(INLIST(SUBSTR(m.s,1,1),"N","I") .AND. INLIST(SUBSTR(m.s,2,1),"N","I"))
RETURN ICASE(!m.s="C", m.parX,;
m.t="S" .AND. ISLOWER(m.t), VALTOTIPs(ALLTRIM(m.parX)),;
m.t="S" .AND. ISUPPER(m.t), VALTOTIPs(m.parX),;
m.t="C" .AND. ISLOWER(m.t), ALLTRIM(m.parX),;
m.parX)
CASE m.s="XC" && .NULL. в символьный тип
RETURN IIF(!m.t="S", ".NULL.", VALTOTIPs(ALLTSTR(".NULL.")))
CASE INLIST(m.s, "CN", "CI") && C в числовой тип
m.r = ROUND(VAL(m.parX),12) && О дробных числах в фокс см. в комментариях к iINT, и forum.foxclub.ru
RETURN IIF(m.r%1=0, INT(m.r), m.r)
CASE INLIST(m.s, "NC", "IC", "YC") && число в символьный тип. Используется в SetGetStringValue() !
m.r = ROUND(m.parX, 12) && О дробных числах в фокс см. в комментариях к iINT, и forum.foxclub.ru
m.c = IIF(m.r%1=0, 0, LEN(LTRIM(STR(INT(m.r))))) && Длина изображения целой части числа. 0 - для целого числа. Если число более 15 разрядов, то будет неправильно...
IF m.c=0 && целое число
m.r = STR(m.r)
ELSE && дробное число
m.r = STR(m.r, maxЗнаковDouble+1, maxЗнаковDouble+1-1-m.c) && также сделано в ALLTSTR()
ENDIF
m.r = ALLTRIM(m.r)
IF "*"$m.r .OR. "E"$m.r && точность фокса не позволила отобразить число
ERROR "Не могу отобразить число: "+TRANSFORM(m.parX)
m.r = TRANSFORM(m.parX)
ELSE && число в пределах точности фокса
IF ТЧК$m.r && изображение дробного числа
m.r = RTRIM(m.r, 1, "0") && завышенная точность представления дробного числа. Уберем незначащие символы "0"
IF RIGHT(m.r,1)=ТЧК
m.r = RTRIM(m.r, 1, ТЧК)
ENDIF
ENDIF
ENDIF
IF m.t="S"
m.r = VALTOTIPs(m.r)
ENDIF
RETURN m.r
CASE m.s="DT" && D в тип датывремя
RETURN DTOT(m.parX)
CASE m.s="TD" && D в тип даты
RETURN TTOD(m.parX)
CASE m.s="CD" .OR. m.s="CT" && C в тип даты (датывремя)
m.x = ALLTRIM(m.parX)
DO CASE
CASE LIKE("{^*}",m.x) && {^YYYY-MM-DD}
m.r = ALLTRIM(m.x,1,"{","}") && {^YYYY-MM-DD}
m.r = LTRIM(m.r, 1, "^")
m.r = ALLTRIM(m.r)
IF !"-"$m.r && не похоже на штатный формат записи фокса
RETURN Самовызов("{"+m.r+"}") && интерпретируем как нештатный формат задания даты
ENDIF
IF GETWORDCOUNT(m.r,"-")<3 .OR.; && не похоже на ожидаемое представление даты
!ISDIGIT(m.r)
m.r = {}
ELSE
m.r = DATE(VAL(GETWORDNUM(m.r,1,"-")),; && не проверяю на допустимость деталей представления даты... А надо бы...
VAL(GETWORDNUM(m.r,2,"-")),;
VAL(GETWORDNUM(m.r,3,"-")))
ENDIF
m.r = IIF(m.s="CT", DTOT(m.r), m.r)
OTHERWISE
m.r = IIF(m.s="CT", DTOT({}), {})
IF LIKE("{*}",m.x) && {DD.MM.YYYY}
m.x = ALLTRIM(m.x,1,"{","}")
ENDIF
IF !LEN(m.x)=LEN(CHRTRAN(m.x,"123456789","")) && есть цифры #0. Попробуем получить дату
LOCAL m.xDATE
m.xDATE = .NULL. && для восстановления исходного SET DATE
m.f = "DMY,YMD,MDY" && примерим такие форматы даты
FOR m.i=0 TO GETWORDCOUNT(m.f,ЗПТ) && примеряем разные форматы даты. 0 - в текущем формате (GERMAN)
IF m.i>0
m.w = ALLTRIM(GETWORDNUM(m.f, m.i, ЗПТ))
IF ISNULL(m.xDATE)
m.xDATE = SET("DATE")
ENDIF
SET DATE &w && ВНИМАНИЕ!Это вызовет перерисовку всех видеополей типа дата!И самое неприятное при этом - смещение курсора! может надо это делать в PRIVATE SESSION
ENDIF
IF m.i=1
m.x = CHRTRAN(m.x, символыДМГразделители, REPLICATE("/", LEN(символыДМГразделители))) && SET DATE DMY и др. понимают только слэш
ENDIF
m.r = IIF(m.s="CT", CTOT(m.x), CTOD(m.x)) && см. SET STRICTDATE TO - позволяет генерировать ERROR 2033 при неверной C-дате
IF !EMPTY(m.r) && удалось интерпретировать дату
EXIT
ENDIF
ENDFOR && примеряем разные форматы даты
IF !ISNULL(m.xDATE)
SET DATE &xDATE && ВНИМАНИЕ!Это вызовет перерисовку всех видеополей типа дата!И самое неприятное при этом - смещение курсора!
ENDIF
ENDIF && есть цифры #0. Попробуем получить дату
ENDCASE
RETURN m.r && C --> D(T)
#UNDEFINE символыДМГ
#UNDEFINE символыДМГразделители
CASE m.s="DC" .OR. m.s="TC" && D(T) в символьный тип, С ДОБАВЛЕНИЕМ СКОБОК {}
m.d = IIF(EMPTY(m.parX), "", IIF(m.s="DC", DTOC(m.parX), TTOC(m.parX)))
m.d = "{"+m.d+"}"
RETURN IIF(!m.t="S", m.d, VALTOTIPs(m.d))
CASE m.s="D*C" .OR. m.s="T*C" && D(T) в символьный тип согласно заданному формату M(М),D(Д),Y(Г)
m.d = IIF(m.s="D", m.parX, TTOD(m.parX))
m.s = m.parTIP && формат (напр. "DDMMYYYY"), может сод и др символы
m.f = IIF(m.p<3, "DMYdmyДМГдмг", m.parDOP) && строка сод преобразуемые буквы в m.s
RELEASE V
DIMENSION V[3,5] && массив для преобр [DD, DDDD, D, "Dd", "Дд"] и так 3 строки для D,M,Y
STORE CHRTRAN(STR(DAY(m.d),2), " ","0") TO V[1,1], V[1,2]
STORE NOMERTOALPHA(DAY(m.d)) TO V[1,3]
STORE CHRTRAN(STR(MONTH(m.d),2), " ","0") TO V[2,1], V[2,2]
STORE NOMERTOALPHA(MONTH(m.d)) TO V[2,3]
STORE CHRTRAN(STR(YEAR(m.d),4), " ","0") TO V[3,1]
STORE CHRTRAN(STR(YEAR(m.d)%100,2), " ","0") TO V[3,2]
m.y = YEAR(m.d)
m.y = ICASE(m.y-2000>=0, NOMERTOALPHA(m.y-2000),;
m.y-1994>=0, NOMERTOALPHA(m.y-1994,"WXYZ$~"),;
m.y>0, "-",;
m.y=0, NOMERTOALPHA(m.y),;
"")
STORE m.y TO V[3,3]
m.c = UPPER(m.s)
V[1,4] = IIF(!"D"$m.c, "", IIF("D"$m.f, "D", "") + IIF("d"$m.f, "d", ""))
V[1,5] = IIF(!"Д"$m.c, "", IIF("Д"$m.f, "Д", "") + IIF("д"$m.f, "д", ""))
V[2,4] = IIF(!"M"$m.c, "", IIF("M"$m.f, "M", "") + IIF("m"$m.f, "m", ""))
V[2,5] = IIF(!"М"$m.c, "", IIF("М"$m.f, "М", "") + IIF("м"$m.f, "м", ""))
V[3,4] = IIF(!"Y"$m.c, "", IIF("Y"$m.f, "Y", "") + IIF("y"$m.f, "y", ""))
V[3,5] = IIF(!"Г"$m.c, "", IIF("Г"$m.f, "Г", "") + IIF("г"$m.f, "г", ""))
m.s = IIF(EMPTY(V[1,4]), m.s, STRTRAN(m.s, REPLICATE(LEFT(V[1,4],1),2), V[1,1], 1, -1, IIF(LEN(V[1,4])>1,1,0)))
m.s = IIF(EMPTY(V[1,5]), m.s, STRTRAN(m.s, REPLICATE(LEFT(V[1,5],1),2), V[1,1], 1, -1, IIF(LEN(V[1,5])>1,1,0)))
m.s = IIF(EMPTY(V[2,4]), m.s, STRTRAN(m.s, REPLICATE(LEFT(V[2,4],1),2), V[2,1], 1, -1, IIF(LEN(V[2,4])>1,1,0)))
m.s = IIF(EMPTY(V[2,5]), m.s, STRTRAN(m.s, REPLICATE(LEFT(V[2,5],1),2), V[2,1], 1, -1, IIF(LEN(V[2,5])>1,1,0)))
m.s = IIF(EMPTY(V[3,4]), m.s, STRTRAN(m.s, REPLICATE(LEFT(V[3,4],1),4), V[3,1], 1, -1, IIF(LEN(V[3,4])>1,1,0)))
m.s = IIF(EMPTY(V[3,5]), m.s, STRTRAN(m.s, REPLICATE(LEFT(V[3,5],1),4), V[3,1], 1, -1, IIF(LEN(V[3,5])>1,1,0)))
m.s = IIF(EMPTY(V[3,4]), m.s, STRTRAN(m.s, REPLICATE(LEFT(V[3,4],1),2), V[3,2], 1, -1, IIF(LEN(V[3,4])>1,1,0)))
m.s = IIF(EMPTY(V[3,5]), m.s, STRTRAN(m.s, REPLICATE(LEFT(V[3,5],1),2), V[3,2], 1, -1, IIF(LEN(V[3,5])>1,1,0)))
m.a = V[1,4]+V[1,5]+V[2,4]+V[2,5]+V[3,4]+V[3,5]
m.b = REPLICATE(V[1,3],LEN(V[1,4])+LEN(V[1,5]))+;
REPLICATE(V[2,3],LEN(V[2,4])+LEN(V[2,5]))+;
REPLICATE(V[3,3],LEN(V[3,4])+LEN(V[3,5]))
m.s = IIF(EMPTY(m.a), m.s, CHRTRAN(m.s, m.a, m.b))
RETURN IIF(m.t#"S", m.s, VALTOTIPs(m.s))
CASE m.s="CL" && C в логический тип
IF INLIST(ALLTRIM(m.parX),".T.",".F.")
RETURN (ALLTRIM(m.parX)=".T.")
ENDIF
RETURN NOT EMPTY(m.parX)
CASE m.s="LC" && L в символьный тип
RETURN IIF(m.t#"S", IIF(m.parX, ".T.", ".F."), VALTOTIPs(IIF(m.parX, ".T.", ".F.")))
CASE INLIST(m.s, "ND", "NT", "ID", "IT") && интерпретирует число как YYMMDD (если число 8-значное то как DTOS-число YYYYMMDD)
IF EMPTY(m.parX)
RETURN IIF(m.s="ND", {}, DTOT({}))
ENDIF
m.y = INT(m.parX/10000) && число-год
m.x = (INT(m.parX/100)%100-1)%12+1 && число-месяц
m.v = (m.parX%100) && число-день
m.d = MGTOD(m.x, m.y) -1 + m.v
RETURN IIF(m.s="ND", m.d, DTOT(m.d))
CASE INLIST(m.s, "DN", "DI") && D в число вида YYYYMMDD
RETURN INT(VAL(DTOC(m.parX,1)))
CASE INLIST(m.s, "NL", "IL")
RETURN NOT EMPTY(m.parX)
CASE INLIST(m.s, "LN", "LI")
RETURN IIF(m.parX, 1, 0)
CASE m.s="DL" .OR. m.s="TL"
RETURN NOT EMPTY(m.parX)
CASE m.s="LD"
RETURN CTOD(IIF(m.parX, "01.01.1980", ""))
CASE m.s="LT"
RETURN CTOT(IIF(m.parX, "01.01.1980", ""))
CASE m.s="C*D" .OR. m.s="C*T" && интерпретирует C как дату с форматом, предст. как D(T)
m.d = m.parX
m.f = m.parTIP
IF NOT EMPTY(m.f)
RELEASE V
DIMENSION V[3,3] && [вес (порядок), длина, тип 1/2/3=Д/М/Г]
V[1,1] = DAY(m.f)
V[1,2] = 2
V[1,3] = 1
V[2,1] = MONTH(m.f)
V[2,2] = 2
V[2,3] = 2
V[3,1] = YEAR(m.f)%10 && последняя цифра года - вес (порядок) в C
V[3,2] = INT((YEAR(m.f)%100)/10) && предпоследняя цифра года - длина года в C
V[3,3] = 3
=ASORT(V,1) && сортировка по весу (порядку) в C
m.l = 0 && суммарная длина, прочитанная из m.parX
m.z = IIF(YEAR(m.f)<1900, 0, 1) && если год>=1900 то в C присутствуют разделители (точки)
FOR m.i=1 TO 3
m.c = V[m.i,2] && длина читаемого элемента
V[m.i,2] = SUBSTR(m.d, m.l+1, m.c)
m.l = m.l+m.c+m.z
ENDFOR
m.l = m.l-m.z && в конце точку не ставят ...
=ASORT(V,3) && сортировка по типу = ДД.ММ.ГГ(ГГ)
m.y = V[3,2]
m.y = IIF(LEN(m.y)=1 .AND. VAL(m.y)<=YEAR(DATE())%100, "200", "")+;
IIF(LEN(m.y)=2 .AND. VAL(m.y)<=YEAR(DATE())%100, "20", "")+;
m.y
m.d = V[1,2]+"."+V[2,2]+"."+m.y
ENDIF
IF EMPTY(CHRTRAN(m.d,"0123456789.",""))
RETURN {}
ENDIF
RETURN CTOD(m.d)
CASE m.s="D " .OR. m.s="T " && вернуть длину, читаемую из C при вызове m.s="C*D" (см выше)
m.f = m.parX
IF !EMPTY(m.f)
RETURN DAY(m.f)+MONTH(m.f)+INT((YEAR(m.f)%100)/10)+IIF(YEAR(m.f)<1900, 0, 2)
ENDIF
RETURN 0
ENDCASE
RETURN m.parX && VALTOTIP
#UNDEFINE Самовызов

Ratings: 0 negative/0 positive
Re: Как проверить число, принятое из Excel, на принадлежность к целым числам?
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
of63
вот такая странная странная программа по преобразованию типов:

Вроде уже задавал ИК такой вопрос - зачем нужно таким странным способом через PCOUNT() объединять разные функции в одну?
Ratings: 0 negative/0 positive
Re: Как проверить число, принятое из Excel, на принадлежность к целым числам?
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
seg856
Как проверить число, принятое из Excel, на принадлежность к целым числам?

Попробуйте так:
? EMPTY(lnNum-INT(lnNum)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 12 kornienko_ru Sergey_K  (Гостей: 10)

© 2000-2024 Fox Club 
Яндекс.Метрика