Определение типа элемента массива
#1
Отправлено 27 апреля 2007 - 07:37
С#Script
.net
День добрый всем, возникла такая проблема:
Есть массив, который содержит различные эллементы: строки,числа,даты. Задача определить к какому конкретному типу относится элемент массива, дабы далее его преобразовать соответственно его типу(конечно можно по определенным индексам осуществлять преобразование, но хотелось написать универсальную функцию по преобразованию, которая анализировала бы содержимое любого массива).
#2
Отправлено 27 апреля 2007 - 07:57
function TypesTest() { var a = new Array(); a[1] = "string"; a[2] = 23.5; a[3] = true; var i; for(i in a) { Log.Message(typeof(a[i])); } }
Выведет в результате
string
number
boolean
типа ДАТА нету, так что если вам надо его как-то отличать от строки, то придется писать дополнительную функцию, используя регэкспы
если что - пишите, поможем :)
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#3
Отправлено 27 апреля 2007 - 08:02
Только вот с числами у меня что-то странное, в том смысле что typeof для них выдает object, а не number.
#4
Отправлено 27 апреля 2007 - 08:19
Может я не тот метод вызываю.
От undefined я избавился и с преобразованием чисел всё нормально но как перегнать 01/03/2007 в строку хотя бы
#5
Отправлено 27 апреля 2007 - 08:47
Только вот с числами у меня что-то странное, в том смысле что typeof для них выдает object, а не number
в моем примере? не верю =)
если же в ваших скриптах, то покажите, как заполняется массив, откуда берутся данные
есть подозрение, что вы берете данные из контролов и делаете это не совсем правильно
например, если бы берете свойство Text поля, и это значение заносите в массив, то попробуйте использовать Text.OleValue
RegExp работает только со строками
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#6
Отправлено 27 апреля 2007 - 08:59
В приложении есть Infragistic.UltraGrid, в котором храняться значения различного плана, а именно числа, даты и строки. На форме есть кнопка CopyAll, которая копирует значения из таблицы в буфер обмена. Затем то, что мы имеем в буфере, сохраняется в Excel. После чего в соответствии с тесткейсами мы с использованием DDTExcelDriver заполняем массив эллементов строки из Excel, который необходимо сравнить со значениями из соответствующей строки grid. Проблема состоит в том, что из grid все значения изымаются как string, причем все числа округлены, а то, что копировалось в буфер обмена и соответственно затем сохранялось в файл, является числами и датами причем не округлеными и в полном формате.
Как вариант есть возможность обратного преобразования содержимого строки в численные значения но вот что делать с датой остается вопросом потому как преобразует она как то весьма своеобразно.
#7
Отправлено 27 апреля 2007 - 09:15
Я использовал такой сценарий:
1) в Excel-файле вписал в ячейку значение 12/12/2007
2) проверил тип поля, Excel говорит, что тип поля Date
3) с помощью DDTExcelDriver считал знчение этого поля и проверил его тип. TestComplete говорит, что string
соответственно, у меня все работает
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#8
Отправлено 27 апреля 2007 - 09:19
У меня там где хранится дата тип ячейки стоит custom.
#9
Отправлено 27 апреля 2007 - 09:30
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#10
Отправлено 27 апреля 2007 - 09:33
А не подскажите txt = Sys["Clipboard"]();в чем ошибка для C#Script
#11
Отправлено 27 апреля 2007 - 09:46
#12
Отправлено 27 апреля 2007 - 09:48
m/d/yyyy h:mm
сделал так же... проверил... все ОК, строка как строка
txt = Sys["Clipboard"];А не подскажите txt = Sys["Clipboard"]();в чем ошибка для C#Script
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#13
Отправлено 27 апреля 2007 - 09:51
В любом случае большое спасибо за помощь. Буду пробовать найти решение, видать где-то закралась какая-нибудь мелкая пакость.
#14
Отправлено 27 апреля 2007 - 11:45
Использовать .Net bridge:
1) С помощью OleDB запихать все значения из excel'я в DataTable
2) Перевести значения в string и сравнивать со строками из грида
или
2) Я никогда не работал с Infragistic.UltraGrid и не знаю, каким образом в этот контрол сетятся значения, но если вдруг с помощью DataTable, то тогда проще сравнить 2-а объекта DataTable без преобразования типов...
#15
Отправлено 27 апреля 2007 - 11:49
А что касается того, что у меня постоянно возвращала Object, так то у меня было помутнение рассудка ))) я вместо typeof() писал typeof[] и в этом была вся загвоздка(сам себя перемудрил).
Теперь вот вошкаюсь чтобы всё таки найти вариант преобразования значения считанного из таблицы в дату.
#16
Отправлено 27 апреля 2007 - 12:42
Покалыпался я покалыпался и вот к чему пришёл:
1) Оператор typeof() вроде как по спецификациии: "The typeof operator returns type information as a string. There are six possible values that typeof returns: "number," "string," "boolean," "object," "function," and "undefined." " - однако для ячейки, содержащей дату он возвращает "date".
2) Метод parse() объекта Date. Cинтаксис Date.parse(dateVal)
The parse method returns an integer value representing the number of milliseconds between midnight, January 1, 1970 and the date supplied in dateVal.
Причем, судя по спецификации dateVal это строка, но и это но весьма интересно в том, что этот метод одинаково хорошо отрабатывает в двух следующих случаях:
dateGridVal = Date.parse("7-17-2006");
dateCellVal = Date.parse(7/17/2006);
причем что очень радует ))) dateGridVal == dateCellVal
Те не обязательно на вход должна поступать строка - и благодаря этому сравнить две даты становиться просто - мы сравниваем не две конкретные даты, а два значения миллисекунд прошедших с midnight, January 1, 1970.
Надеюсь что кому-нибудь эта информация поможет.
За сим всем спасибо за помощь.
#17
Отправлено 27 апреля 2007 - 13:13
однако для ячейки, содержащей дату он возвращает "date".
нашел вот тут
В Microsoft JScript операция typeof может возвращать еще два значения: "date" (тип VT_DATE стандарта COM) и "unknown" (COM-интерфейсы ActiveX).
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
#18
Отправлено 27 апреля 2007 - 13:19
И какой источник информации после этого выбрать))) чтобы всегда смочь найти то, что надо, если даже на родном сайте такого не могли написать))) http://msdn.microsof...bbfe2330aa9.asp
Вот и что делать начинающим людям как мне) хотя как говориться жить захочешь не так закрутишься я тут ёщё как вариант подумал что можно попробовать
if (obj instanceof Date)
{
}
поидее тоже отработает.
#19
Отправлено 27 апреля 2007 - 13:36
ну выложу, что ли, не пропадать же добру
function _typeof(value) { switch(typeof(value)) { case "string": return (value.match(/\d{1,2}[\/.-]\d{1,2}[\/.-]\d{2,4}/) != null) ? "date" : "string"; break; default: return typeof(value); } }
возвращает "date" для строк следующих форматов (# - это любая цифра):
##/##/##, #/##/##, ##/#/##, #/#/##
##/##/####, #/##/####, ##/#/####, #/#/####
и то же самое, но если в качестве разделителя выступает точка или дефис, а не слеш
##.#.##, #.##.##, ##.#.##, #.#.##
##.##.####, #.##.####, ##.#.####, #.#.####
##-#-##, #-##-##, ##-#-##, #-#-##
##-##-####, #-##-####, ##-#-####, #-#-####
наверное можно и улучшить этот регексп, но я их только вчера начал изучать, так что уж простите =)
TestComplete для начинающих (видеозаписи курса)
Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)
Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 анонимных