Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
hlopotun
Member

Откуда:
Сообщений: 250
Всем добрый вечер,

возможно ли такое стандартными функциями форматирования если изначально известно количество знаков после запятой или расположение разделителей в дате. Но ни те ни другие там не стоят. Понятно что можно иx туда программно вставить и потом форматировать. Интересна возможность сделать полное переформатирование не имея разделителей в исходном тексте стандартными функциями delphi. И как бы выглядела тогда их строка формата.

Спасибо за советы.
26 мар 21, 00:08    [22300151]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7496
hlopotun,

Такая функция существует и называется SubString.
26 мар 21, 00:43    [22300164]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3831
hlopotun,

может регулярки помогут?
26 мар 21, 01:01    [22300165]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
hlopotun
Member

Откуда:
Сообщений: 250
makhaon
hlopotun,

может регулярки помогут?


помогут, думал может есть что попроще.
С регулярками каждый раз как в первый класс.
26 мар 21, 01:03    [22300167]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 12789
StrToInt('+123123') / 100;
Str := '20210124';
EncodeDate(
  StrToInt(Copy(Str, 1, 4)),
  StrToInt(Copy(Str, 5, 2)),
  StrToInt(Copy(Str, 7, 2))
)
26 мар 21, 13:18    [22300332]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 55410
hlopotun,

у вас на входе - число (какого типа) или строка?
26 мар 21, 13:21    [22300334]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
hlopotun
Member

Откуда:
Сообщений: 250
andreymx,

на входе строки.

Это попытка универсально описать процесс конвертации входящих данных при их сохранении в базе.
Типа пользователь указывает какое поле в какое поле сохранять и как его при этом конвертировать.
Конечно с регулярками самое правильное решение но заставлять конечного пользователя с ними разбираться будет неправильно.
Какая конвертация понадобится заранее неизвестно. Поэтому, скорее всего прийдётся изобретать велосипед с масками вида:
+*AB -> *,AB
ABCDEFGH -> GH.EF.ABCD
где каждый символ в маске исходной имеет такой же символ в маске целевой и на основе его позиции делать перестановку.
Нужно что то с чем конечный пользователь способен разобраться. Большой сложности при конвертации не ожидается, простая перестановка местами и вставка разделителей в нужных местах. Регулярки тут явно всё усложнят. Народ не поймёт (c)
27 мар 21, 18:02    [22300817]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 55410
hlopotun,

Стандартный вопрос
03.02.11 - это какая дата?
27 мар 21, 18:04    [22300818]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

hlopotun
Народ не поймёт (c)

Делай как в Ёкселе: "эта хрень - число, а эта - дата", дальше сам разберёшься.

Posted via ActualForum NNTP Server 1.5

27 мар 21, 18:05    [22300820]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
hlopotun
Member

Откуда:
Сообщений: 250
andreymx
hlopotun,

Стандартный вопрос
03.02.11 - это какая дата?


подразумевается что конечный пользователь знает какая.
27 мар 21, 18:08    [22300823]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9961
hlopotun
помогут, думал может есть что попроще.
С регулярками каждый раз как в первый класс.

Была бы sscanf ...
27 мар 21, 18:56    [22300849]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
Cobalt747
Member

Откуда:
Сообщений: 2300
hlopotun
andreymx
hlopotun,

Стандартный вопрос
03.02.11 - это какая дата?


подразумевается что конечный пользователь знает какая.

Тогда храните как есть, раз уж ПО не должно знать формат.
28 мар 21, 14:17    [22301069]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
JayDi
Member

Откуда: Сызрань, Россия
Сообщений: 4173
StrToDateTime
StrToFloat

Оба метода принимают FormatSettings. Создаем копию настроек через FormatSettings.Create, после чего настраиваем формат даты и плавающей точки (единственное, надо пробелы убрать из суммы, если будут).

А дальше через try ... except on e: exception ... end;

  settings = TFormatSettings.Create;
  settings.ThousandSeparator := ' '; // бесполезен, надо вручную удалять пробелы
  settings.DecimalSeparator := ',';
  settings.DateSeparator := '.';
  settings.ShortDateFormat := 'yyyy/MM/dd';
28 мар 21, 14:24    [22301070]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

JayDi
А дальше через try ... except on e: exception ... end;

Ну-ну, удачи тебе с различением yy/mm/dd, dd/mm/yy и mm/dd/yy через исключения.

Posted via ActualForum NNTP Server 1.5

28 мар 21, 14:26    [22301071]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
JayDi
Member

Откуда: Сызрань, Россия
Сообщений: 4173
Dimitry Sibiryakov

Ну-ну, удачи тебе с различением yy/mm/dd, dd/mm/yy и mm/dd/yy через исключения.

Догадками занимается делфи. А исключение -- это ошибка, т.е. дальше мы ничего не должны обрабатывать или пытаться угадать, а тупо должны сообщить пользователю, что он неверно указал формат данных. Вроде именно в этом и была первоначальная задача.
28 мар 21, 14:30    [22301075]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1670
JayDi

  settings.ThousandSeparator := ' '; // бесполезен, надо вручную удалять пробелы

Если что - там может быть не пробел, а символ похожий на пробел, но с другим кодом.
Код не помню.
Сам накалывался на это.
28 мар 21, 18:58    [22301152]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 55410
fraks
JayDi

  settings.ThousandSeparator := ' '; // бесполезен, надо вручную удалять пробелы


Если что - там может быть не пробел, а символ похожий на пробел, но с другим кодом.
Код не помню.
Сам накалывался на это.
неразрывный пробел
Код 160
28 мар 21, 19:52    [22301165]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
JayDi
Member

Откуда: Сызрань, Россия
Сообщений: 4173
fraks

Если что - там может быть не пробел, а символ похожий на пробел, но с другим кодом.
Код не помню.

Нет, это именно функция StrToFloat игнорирует знак валюты и тысячный разделитель, выдавая исключение.
28 мар 21, 20:51    [22301173]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 52921

И это логично, поскольку она для вещественных чисел и использует форматы вещественных
чисел, а не денег, у которых совсем другие форматы. Они даже задаются на разных вкладках
региональных настроек.

Posted via ActualForum NNTP Server 1.5

28 мар 21, 22:06    [22301201]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
Fr0sT-Brutal
Member

Откуда:
Сообщений: 682
Уже страницу понаписали, а так и не понятно, с чего вдруг такой кривой ввод, без разделителей.
По сабжу: задавать маски. Т.е. юзер должен подсказать программе формат, что-то типа такого

Формат входных данных (N - цифры целой части, M - цифры дробной): [-NNNNMM]
Пример: [+123456]
Результат: [+1234,56]

Ну и пресеты, MRU и прочие вспомогатели, чтоб каждый раз не вбивать. Превьюшка результата очень желательно, чтобы не кидать в юзера ошибками после начала импорта

Сообщение было отредактировано: 29 мар 21, 11:26
29 мар 21, 11:32    [22301331]     Ответить | Цитировать Сообщить модератору
 Re: Число вида +123123 сформатировать в 1231,23. Дату 20210124 в 24.01.2021  [new]
ну я
Member

Откуда: Москва
Сообщений: 1255
hlopotun
andreymx,

на входе строки.

Это попытка универсально описать процесс конвертации входящих данных при их сохранении в базе.
Типа пользователь указывает какое поле в какое поле сохранять и как его при этом конвертировать.
Конечно с регулярками самое правильное решение но заставлять конечного пользователя с ними разбираться будет неправильно.
Какая конвертация понадобится заранее неизвестно. Поэтому, скорее всего прийдётся изобретать велосипед с масками вида:
+*AB -> *,AB
ABCDEFGH -> GH.EF.ABCD
где каждый символ в маске исходной имеет такой же символ в маске целевой и на основе его позиции делать перестановку.
Нужно что то с чем конечный пользователь способен разобраться. Большой сложности при конвертации не ожидается, простая перестановка местами и вставка разделителей в нужных местах. Регулярки тут явно всё усложнят. Народ не поймёт (c)


В М системах такая функция называется $translate(source,from,to)
Функция заменяет в исходной строке символы указанные во втором параметре на символы из третьего параметра в той же позиции. Если в третьем параметре нет такой позиции то заменяет на пустую строку.

function translate(Source: string; pFrom: PChar; pTo: PChar): string;
begin
  Result := Source;
  while(pFrom^ <> #0) do
  begin
    if pTo^ <> #0 then
      Result := StringReplace(Result, pFrom^, pTo^, [rfReplaceAll])
    else
      Result := StringReplace(Result, pFrom^, '', [rfReplaceAll]);
    Inc(pFrom);
    if pTo^ <> #0 then
      Inc(pTo);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  sFrom: String;
  sTo: String;
  sSource: String;
begin
  sFrom := edtFrom.Text; // YyUuMmDd
  sTo := edtTo.Text; // 20210124
  sSource := edtSource.Text;  // Dd.Mm.YyUu
  edtResult.Text :=
    translate(edtSource.Text, PChar(sFrom), PChar(sTo)); // 24.01.2021
end;


В вашем случае задаются маски для From и Source.
А на что заменять - это символы из исходной строки To.
В вашем случае нужен как-бы replace наоборот - исходная строка 20210124 задает на что нужно заменить, Source задает формат с разделителями

Сообщение было отредактировано: 2 апр 21, 11:38
2 апр 21, 11:43    [22303282]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить