Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.103.10] |
|
Сообщ.
#1
,
|
|
|
Подскажите, как узнать тип получаемых данных (тип поля)?
У меня есть шаблон в котором есть мои внутренние теги заключенные в ~ (твидеры) Пример: <span class="textTitle">Цена:</span> <span class="textTitleBRed">~SUM_RES~ руб.</span> <span class="textTitle">Дата изменения:</span><span class="text"> ~LAST_UPDATE_DATE~</span><br> ~SUM_RES~ - имя поля В цикле - заменяю их на значение полей. Получаемые данные не совсем удовлетворяют требованиям. Т.е. сумма и дата не в нужном формате. Хочу предварительно получать тип данных, форматировать в нужный формат, а затем заполнять шаблон. |
Сообщ.
#2
,
|
|
|
тут есть два выхода:
1) научить саму базу выдавать данные в нужном формате. 2) использовать метаданные. первый не буду объяснять. (про формат много в справочной системе написано, но если не разберешься тогда пиши.) для второй нужно будет немного дописывать компонент (почему то разработчики vcl сделали на ее месте заглушку которая почти ничего не делает) я предположил что ты работает через MySql: 1) открываем файл mysql.inс.php 2) находим там код class MySQLDatabase extends CustomConnection { public $_connection=null; protected $_debug=0; protected $_databasename=""; protected $_host=""; protected $_username=""; protected $_userpassword=""; protected $_connected="0"; protected $_dictionary=""; protected $_dictionaryproperties=false; function MetaFields($tablename) { $metaColumnsSQL = "SHOW COLUMNS FROM `%s`"; $rs = $this->Execute(sprintf($metaColumnsSQL,$tablename)); $result=array(); while ($row=mysql_fetch_row($rs)) { $result[$row[0]]=''; } return($result); } 3) функцию MetaFields немного дописываем function MetaFields($tablename) { $metaColumnsSQL = "SHOW COLUMNS FROM `%s`"; $rs = $this->Execute(sprintf($metaColumnsSQL,$tablename)); $result=array(); while ($row=mysql_fetch_row($rs)) { $result[$row[0]]=array('type'=>$row[1]); } return($result); } 4) сохраняем. теперь вот таким способом можно запросить данные для таблицы `user` $MetaFields = $this->MySQLDatabase1->MetaFields('user'); а вот таким образом можно вывести все поля+значения+тип поля таблицы `user` $arr = $this->MySQLQuery1->Fields; reset($arr); while(list($Field, $value) = each($arr)) { echo "Field: $Field; Value: $value; Type: ".$MetaFields[$Field]['type']."<br>\n"; } пс. рекомендовал бы первый способ. |
Сообщ.
#3
,
|
|
|
Цитата nstur @ Подскажите, как узнать тип получаемых данных (тип поля)? У меня есть шаблон в котором есть мои внутренние теги заключенные в ~ (твидеры) Пример: <span class="textTitle">Цена:</span> <span class="textTitleBRed">~SUM_RES~ руб.</span> <span class="textTitle">Дата изменения:</span><span class="text"> ~LAST_UPDATE_DATE~</span><br> зачем для такого шаблона узнавать тип данных ? это лишнее действие... там же ясно написано - рубли это значит что выводить нужно рубли не зависимо от того что там в базе а при записи в базу нужно контролировать что бы туда текст левый (не рубли) не попал при этом лежать в базе может как угодно, а форматировать нужно на этапе вывода на экран при этом, например: количество знаков после запятой обычно может менятся как от отчёта так и от настроек всей системы бухгалтер обычно хочет видеть всё до копеек, а если округление, скидки, то и до 3-4 знаков после запятой но руководитель обычно с копейками не возится - давай целые не хранить же в базе в двух видах одно и тоже таким образом - компонент не стоит курочить во всяком случае для этой задачи (чем меньше изменений в компонентах тем они совместимее) предлагаю для данного случая такие функции (хотя это уже чистый php) Цитата Для форматирования чисел типа float команда number_format Описание string number_format ( float $number [, int $decimals ] ) string number_format ( float $number , int $decimals , string $dec_point , string $thousands_sep ) number_format() возвращает отформатированное число number . Функция принимает один, два или четыре аргумента (не три): Если передан только один аргумент, number будет отформатирован без дробной части, но с запятой (",") между группами цифр по 3. Если переданы два аргумента, number будет отформатирован с decimals знаками после точки (".") и с запятой (",") между группами цифр по 3. Если переданы все четыре аргумента, number будет отформатирован с decimals знаками после точки и с разделитилем между группами цифр по 3, при этом в качестве десятичной точки будет использован dec_point , а в качестве разделителя групп - thousands_sep . Используется только первый символ строки thousands_sep . Например, при передаче foo в качестве thousands_sep для форматирования числа 1000, number_format() возвращает 1f000. Например: для того что бы вывести число с двумя знаками после запятой(здесь будет округление) и разделением между группами по три знака пробелами делаем так: $xxx = 12345.678912; number_format($xxx,2,'.',' '); // получим 12 345.68 ещё есть floatval для преобразования строки пример: <?php $var = '122.34343The'; $float_value_of_var = floatval($var); echo $float_value_of_var; // 122.34343 ?> |
Сообщ.
#4
,
|
|
|
Просто я переделываю программу на PHP - есть такая необходимость
Дело в том, что шаблон и его содержимое будет меняться ($q1) И формат выводимых данных будет меняться в зависимости от 'имени' поля. for ($k = 0; $k < $this->Pager1->RecordsPerPage; $k++) { global $q1; $tempstr = $q1 $fn = GetWith1On2($tempstr,False,'~~'); //метод ищет значения, заключенные в указанные символы while (!empty($fn)) { $tempstr = str_replace('~'.$fn.'~', $this->qty_fill_dbgrid->fieldget($fn), $tempstr); $fn = GetWith1On2($tempstr,False,'~~'); } $this->TextGrid->Caption = $this->TextGrid->Caption.$tempstr; ... } Если есть какие возможность о которых я не подозреваю, подскажите пожалуста... Думаю есть выход. Задавать в самом шаблоне тип данных и маску для форматирования. |
Сообщ.
#5
,
|
|
|
Цитата nstur @ Думаю есть выход. Задавать в самом шаблоне тип данных и маску для форматирования. как вариант например: ~SUM_RES::float::2#.# ~ (это для случая number_format ( $test , 2,'.',' ' ); ) тогда можно вытащить значения так $templ_value = //сюда подставляем значение из поля базы данных $templ_array = explode('::',$templ_value); if ($templ_array[1]=='float') { $templ_format = explode('#',$templ_array[2]); $this->Edit5->Text =number_format ( $templ_array[0] , $templ_format[0],$templ_format[1],$templ_format[2] ); } else... |