Перейти к содержимому


Печатная форма, условие IF, формат данных.


Сообщений в теме: 9

#1 mak

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 207 сообщений

Отправлено 25 Март 2011 - 11:29

Здравствуйте.

В печатной форме есть код:

{capture name="count_charNaimenMax"} 200 {/capture}
{capture name="count_charNaimenSumm"} 0 {/capture}

цикл...
{capture name="count_charNaimen"} {$subtable.Naimenovanie_bak|count_characters} {/capture}
{capture name="count_charNaimenSumm"} {$smarty.capture.count_charNaimenSumm + $smarty.capture.count_charNaimen} {/capture}
...
...
{if $smarty.foreach.Pozicii_scheta.last eq "0" and [b]$smarty.capture.count_charNaimenSumm gt $smarty.capture.count_charNaimenMax[/b]}
код
....
...

цикл конец.

т.е. мне надо посчитать сумму количества знаков в поле и при превышении константы - выполнить условие.
подсчет проводится корректно, а сравнение в условии IF нет.

данные сравниваются как текст, а не как числа.
как можно указать что переменная является числом???

и еще: функция count_characters странно считает символы, у меня постоянно получается меньше. и чем больше символов, тем больше разница. например я насчитал 32 - она 35, я 91 - она 137. в чем может быть проблемма?

#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 25 Март 2011 - 11:42

Просмотр сообщенияmak (25.3.2011, 11:29) писал:

функция count_characters странно считает символы, у меня постоянно получается меньше. и чем больше символов, тем больше разница. например я насчитал 32 - она 35, я 91 - она 137. в чем может быть проблемма?
Начиная с версии 1.9.0 текстовые данные в программе хранятся и передаются в формате Unicode (utf-8), где как известно один символ может выражаться более чем одним байтом. Поэтому стандартные функции работы с текстом, в том числе и в Smarty, могут работать некорректно.

#3 mak

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 207 сообщений

Отправлено 25 Март 2011 - 11:47

Просмотр сообщенияРазработчик (25.3.2011, 11:42) писал:

Начиная с версии 1.9.0 текстовые данные в программе хранятся и передаются в формате Unicode (utf-8), где как известно один символ может выражаться более чем одним байтом. Поэтому стандартные функции работы с текстом, в том числе и в Smarty, могут работать некорректно.
это можно как-то обойти?
кстати, в заголовках страницы указываю формат CHARSET=windows-1251, иначе форма отправленная в письме, отображается некорректно.

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 25 Март 2011 - 11:51

Просмотр сообщенияmak (25.3.2011, 11:47) писал:

это можно как-то обойти?
Поищите в документации по Smarty. Если в Smarty решения нет, используйте скрытые вычисляемые поля.

#5 mak

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 207 сообщений

Отправлено 25 Март 2011 - 12:05

а по основному вопросу?
как заставить условие сравниваться как число а не текст?

#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 25 Март 2011 - 12:11

Просмотр сообщенияmak (25.3.2011, 12:05) писал:

а по основному вопросу?
как заставить условие сравниваться как число а не текст?
Преобразуйте текст в число теми же модификаторами smarty.

#7 mak

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 207 сообщений

Отправлено 25 Март 2011 - 12:15

Просмотр сообщенияРазработчик (25.3.2011, 11:51) писал:

Поищите в документации по Smarty. Если в Smarty решения нет, используйте скрытые вычисляемые поля.

смотрел, видимо нет.
придется вычисляемыми полями...
если не ошибаюсь, SQL позволяет подсчитать количество символов в строке...

вот, нашел: LENGTH(str) ,OCTET_LENGTH(str) ,CHAR_LENGTH(str) ,CHARACTER_LENGTH(str) для CHAR_LENGTH() и CHARACTER_LENGTH() многобайтные символы учитываются только однажды.

запрос в вычисляемом поле должен быть примерно таким?

select CHAR_LENGTH(поле) from таблица where id=текущий id

#8 mak

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 207 сообщений

Отправлено 25 Март 2011 - 12:15

Просмотр сообщенияРазработчик (25.3.2011, 12:11) писал:

Преобразуйте текст в число теми же модификаторами smarty.

не видел таких, поищу.
спасибо за наводку. :(

#9 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 762 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 25 Март 2011 - 12:19

Просмотр сообщенияmak (25.3.2011, 12:15) писал:

запрос в вычисляемом поле должен быть примерно таким?

select CHAR_LENGTH(поле) from таблица where id=текущий id
Вообще говоря, в вычисляемом поле в основном используется PHP, там можно посчитать число символов в многобайтной строке через функцию mb_strlen.

#10 mak

    Активный участник

  • Активный пользователь
  • PipPipPip
  • 207 сообщений

Отправлено 25 Март 2011 - 12:34

Просмотр сообщенияРазработчик (25.3.2011, 12:19) писал:

Вообще говоря, в вычисляемом поле в основном используется PHP, там можно посчитать число символов в многобайтной строке через функцию mb_strlen.

получилось! спасибо!





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных