Как организовать заполнение маски справа-налево (cxMaskEdit, MaskEdit) ?

Антохин
Дата: 03.05.2011 10:38:04
Есть такая задача: организовать ввод денежной суммы в формате "****,**", причём необходимо чтобы числа вводились слева-направо, то есть следующим образом, например ввод числа 123 - "****,*1" -> "****,12" -> "***1,23".

Указываю перед маской "!" - не помогает...
Sharkfire
Дата: 04.05.2011 12:12:58
Антохин, я думаю так выйдет. надо писать свои костыли. я в MaskEdit уже не раз разочаровывался, там многие простые вещи не сделаешь.
DimaBr
Дата: 04.05.2011 12:18:03
зачем вам cxMaskEdit если есть cxCurrencyEdit
Konstantin-78
Дата: 02.02.2015 16:58:51
Ну вот а всетаки, у меня обычный label отображает сумму размера файлов в байтах, например 28883684596 и мне нужно превратить его в вид: 28,883,684,596 (разбором строчки заниматься не хотелось бы).
Посмотрел "cxMaskEdit", но в нем у меня не получается достичь результата вида: 28,883,684,596, когда я ему пытаюсь присвоить 28883684596
DarkMaster
Дата: 02.02.2015 17:21:13
Konstantin-78,

Попробуй так:

 OldDS:=DecimalSeparator;  OldTS:=ThousandSeparator;
 DecimalSeparator:='.'; ThousandSeparator:=',';

 MY_NUMBER_STR:=Format('%n',[ANumber]);    // <--- %n в строке форматирования.

 DecimalSeparator:=OldDS; ThousandSeparator:=OldTS;


А потом просто откуси до точки в конце строки...
defecator
Дата: 02.02.2015 17:27:53
Konstantin-78
Ну вот а всетаки, у меня обычный label отображает сумму размера файлов в байтах, например 28883684596 и мне нужно превратить его в вид: 28,883,684,596 (разбором строчки заниматься не хотелось бы).
Посмотрел "cxMaskEdit", но в нем у меня не получается достичь результата вида: 28,883,684,596, когда я ему пытаюсь присвоить 28883684596


Может быть, поможет:
http://m-ivanov.livejournal.com/6653.html
Guest2013
Дата: 03.02.2015 04:12:44
Konstantin-78,

посмотри в сторону TFormatSettings и FormatFloat
var
  FileSize: Integer;
  FS: TFormatSettings;
begin
  FileSize := 1234567890;
  FS.ThousandSeparator := ',';
  Label1.Caption := FormatFloat(',#', FileSize, FS);
end;
Konstantin-78
Дата: 03.02.2015 12:59:10
Guest2013,

Да это хороший вариант, но у меня размер больше "integer".
И библиотекта складывающая рамеры файлов (Гб) оперирует "string" (но это не важно)
Guest2013
Дата: 03.02.2015 16:00:02
Konstantin-78,

Используйте Int64, неужели 2^63 не хватит?

Либо рисуйте свой велосипед, такую функцию накидать дело 5-ти минут:
function FormatFileSize(AFSize: string; AThousandSeparator: Char): string;
var
  i: Integer;
  C: Char;
begin
  i := 0;
  Result := '';
  while ( i < Length(AFSize) ) do
  begin
    C := AFSize[Length(AFSize)-i];
    Result := C + Result;
    Inc(i);
    if ( (i mod 3) = 0 ) then
      Result := AThousandSeparator + Result;
  end;
end;
Konstantin-78
Дата: 03.02.2015 17:09:37
ага,
вот подсказали такую конструкцию, например:

var
  S: string;
  ff: int64;
begin
S:='42122128883684596';
ff:=StrToInt64(S);
Label1.Caption:=FormatFloat('#,###,###.###', ff);
end;