Юзер хочет продвинутое форматирование чисел

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Юзер хочет продвинутое форматирование чисел

Сообщение Climber »

Ну то есть не совсем странного, но тем не менее.
Предыстория. Нужно поле доя ввода чисел с плавающей точкой. Я долго лазил по форумам и пришел к выводу, что MaskEdit для этого не подходит. Но можно сделать простенький обработчик OnKeyPress и разрешить нажимать числа, точку (в количестве одной шт.) и backspace.
История.
Показал одному юзеру, ему вроде нравится, но он хочет, чтобы при вводе число сразу само форматировалось (т. е. группы разрядов по 3 отделялись пробелами). Пока рабочая версия форматирует по событию OnExit, а в процессе ввода числа идут без форматирования. Отформатировать не проблема с помощью FloatToStrF, а вот обратная функция TryStrToFloat не умеет (или это я не умею?) определять пробелы в форматированной строке (или что там за символ?). Плюс к этому прибавляется проблема управлением курсором в случаях, когда из-за форматирования меняется число символов в поле для ввода.
Как-то можно такое сделать?

Добавлено спустя 4 минуты 58 секунд:

Код: Выделить всё

function FloatFromString(str: string): extended;
{ Преобразование форматированнй строки вида "123 456 789,00" с пробелами в число }
var tempstr, astr: ansistring;
    i: longint;
begin
  astr:=UTF8ToSys(str);
  for i:=1 to length(astr) do
    if astr[i] <> ' ' then
       tempstr:=tempstr + astr[i];
  if not TryStrToFloat(tempstr, Result) then
     Result:=0;
end;

Форматирую так:
procedure TForm1.Edit1Change(Sender: TObject);
begin
Edit1.Text:=SysToUTF8(FloatToStrF(FloatFromString(Edit1.Text), ffNumber, 15, 2));
end;
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

На вкладке RTTI есть ещё один элемент типа MaskEdit. Его не пробовали?
Аватара пользователя
Nik
энтузиаст
Сообщения: 573
Зарегистрирован: 03.02.2006 23:08:09
Откуда: Киров
Контактная информация:

Сообщение Nik »

Во вложении мой компонент CurrencuEdit. Наследуется от обычного TEdit, фильтрует ввод, умеет возвращать числовое значение через свойство Value (нет нужны в использовании CurrToStr и StrToCurr). Если немного поколдовать, пробелы можно легко добавить.

Если подойдёт - пользуйтесь :)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

Vadim писал(а):На вкладке RTTI есть ещё один элемент типа MaskEdit. Его не пробовали?

Нет, не пробовал пока. А вообще, что там за компоненты на этой вкладке?

Добавлено спустя 46 секунд:
Nik
GrayEddy
Спасибо, попробую оба, но чуть позже.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

Climber писал(а):А вообще, что там за компоненты на этой вкладке?

Тоже никогда не пользовался. :) Судя по описанию, они должны подключаться к каким-нибудь стандартным компонентам, published свойствам, и получать run-time информацию.

Кстати, в наборе компонентов RXFPC алекса тоже есть компонент CurrencyEdit, кгде можно задать маску.
alexkam
постоялец
Сообщения: 152
Зарегистрирован: 07.09.2009 20:03:59

Сообщение alexkam »

Как в CurrencyEdit выровнять текст по правому краю при вводе значения?
Climber
постоялец
Сообщения: 415
Зарегистрирован: 03.06.2007 20:09:57
Откуда: Москва

Сообщение Climber »

alexkamЯ пока этот компонент не смотрел, но если это наследник от TCustomEdit, то так же, как и везде - с помощью Aligment...
Ответить