Code: |
function LoCaseRus( ch : Char ) : Char; {Перевод символа в нижний регистр для русского алфавита} asm CMP AL,'A' JB @@exit CMP AL,'Z' JA @@Rus ADD AL,'a' - 'A' RET @@Rus: CMP AL,'Я' JA @@Exit CMP AL,'А' JB @@yo ADD AL,'я' - 'Я' RET @@yo: CMP AL,'?' JNE @@exit MOV AL,'?' @@exit: end; |
- Подробности
- Родительская категория: Работа со строками
- Категория: Форматирование строк
Code: |
{ **** UBPFD *********** by delphibase.endimus **** >> Повтор строки заданное количество раз
Input - строка для повторения Rep - количество повторений
Строка на выходе это входная строка повторенная Rep раз.
Зависимости: Стандартные модули Автор: Ru, DiVo_Ru @ rambler.ru, Одесса Copyright: DiVo 2002 creator Ru (по мотивам функции Str из Word Basic) ***************************************************** }
function MulStr(Input: string; Rep: integer): string; var i: integer; begin for i := 0to Rep - 1do result := result + Input; end; Пример использования:
s1 := 'Привет'; s := MulStr(s1, 3);
// результат: s := 'ПриветПриветПривет'; |
- Подробности
- Родительская категория: Работа со строками
- Категория: Форматирование строк
Code: |
{ **** UBPFD *********** by delphibas e.endimus .com **** >> Удаление пробелов в начале строки
Функция возвращает строку без пробелов в начале (если они были)
Зависимости: Windows, SysUtils Автор: Hastlero Copyright: HasTler0 ***************************************************** }
var i: Integer; begin if Length(str) = 0then begin DelSpaces := str; Exit; end; for i := 1to length(str) do begin if pos(' ', str) = 1then delete(str, 1, 1) else begin DelSpaces := str; Break; end; end; end; //Пример использования:
Str := DelSpaces(Str); |
Изобретателям велосипеда посвящается:
TrimRight - удаляет пробелы в начале строки, в том числе и в юникодных строках
TrimLeft - удаляет пробелы в конце строки, в том числе и в юникодных строках
Trim - удаляет пробелы в начале и в коце строки, в том числе и в юникодных строках
- Подробности
- Родительская категория: Работа со строками
- Категория: Форматирование строк
Code: |
{ **** UBPFD *********** by delphibase.endimus**** >> Примеры форматирования строк с использованием API-функции wvsprintf
Примеры показывают приемы использования функции wvsprintf в Delphi для форматирования строк. Эта функция входит в состав Windows API (реализована в user32.dll), поэтому не требует подключения модуля SysUtils по сравнению с аналогичной функцией Format.
Зависимости: Windows Автор: Внук, Zhigalin @ poria.ru, ICQ:60571446, Самара Copyright: Внук
***************************************************** }
// Пример использования функции wvsprintf с двумя параметрами разного типа
function WinFormat(out TargetString: AnsiString): Boolean; const FormatStr = 'String Parameter:"%s", Number Parameter:%05d'; var StrParam: AnsiString; NumberParam, FormatResult: Integer; ParamArray: array[0..1] of Pointer; begin NumberParam := 105; // Задаем значение первого параметра StrParam := 'Hello'; // Задаем значение второго параметра SetLength(TargetString, 50); // Должно быть достаточно места для результата. // Без этой строки работать не будет ParamArray[0] := @StrParam[1]; ParamArray[1] := Pointer(NumberParam); FormatResult := wvsprintf(PChar(TargetString), FormatStr, PChar(@ParamArray)); if FormatResult < Length(FormatStr) then// В случае ошибки значение функции // меньше длины шаблонной строки begin TargetString := ''; Result := False; end else result := True; end;
// Пример использования функции wvsprintf с одним параметром
function SimpleWinFormat(out TargetString: AnsiString): Boolean; const FormatStr = 'Number Parameter:%05d'; var NumberParam, FormatResult: Integer; begin NumberParam := 112; SetLength(TargetString, 50); // Должно быть достаточно места для результата. // Без этой строки работать не будет FormatResult := wvsprintf(PChar(TargetString), FormatStr, PChar(@NumberParam)); if FormatResult < Length(FormatStr) then// В случае ошибки значение функции // меньше длины шаблонной строки begin TargetString := ''; Result := False; end else result := True; end; Пример использования:
uses Dialogs, ...; ... var S: AnsiString; ... begin ... if WinFormat(S) then ShowMessage(S) else ShowMessage('An error has been occured!'); if SimpleWinFormat(S) then ShowMessage(S) else ShowMessage('An error has been occured!'); ... end; ... |
- Подробности
- Родительская категория: Работа со строками
- Категория: Форматирование строк
Code: |
{ **** UBPFD *********** by delphibase .endimus. com **** >> Форматирование строки с использованием подстановочных символов %1, %2 и т.д.
Функция заменяет в строке Str все подстроки '%1', '%2', и т.д. На соответсвующие значения из массива Values. При этом значения этого массива не должны содержать подстановочных подстрок, в противном случае возможно зависание функции.
Зависимости: SysUtils Автор: Dimka Maslov, mainbox @ endimus.ru, ICQ:148442121, Санкт-Петербург Copyright: Dimka Maslov ***************************************************** }
{Эта функция работает неверно, если в строке, на которую надо заменить %1,%2,… содержится одна из строк %1,%2,… ( она зависнет в бесконечном цикле )}
function FmtString(const Str: string; const Values: arrayofstring): string;
function InternalPos(SubStr: string; Str: PChar; out P: Integer): Integer; var Ptr: PChar; begin Ptr := StrPos(Str, PChar(SubStr)); if Ptr = nilthen Result := -1 else Result := Integer(Ptr) - Integer(Str); P := Result; end;
function InternalReplace(const Str, OldSub, NewSub: string): string; var PrePos: Integer; CurPos: Integer; OldLen, NewLen: Integer; begin PrePos := 1; Result := Str; OldLen := Length(OldSub); NewLen := Length(NewSub); while InternalPos(OldSub, @Result[PrePos], CurPos) >= 0do begin Inc(PrePos, CurPos); Delete(Result, PrePos, OldLen); Insert(NewSub, Result, PrePos); Inc(PrePos, NewLen); end; end;
var i: Integer; begin Result := Str; for i := High(Values) downto Low(Values) do Result := InternalReplace(Result, '%' + IntToStr(i + 1), Values[i]); end; Пример использования:
FmtString('%1 %2', ['Пример', 'использования']); |
- Подробности
- Родительская категория: Работа со строками
- Категория: Форматирование строк
Code: |
{ **** UBPFD *********** by delphibase.endimus **** >> удаление лишних пробелов в строке
удаляет из строки лишние пробелы без использования всяких указателей и т.д.
Зависимости: стандартные модули Автор: Артем, boss1999 @ mail.ru, москва Copyright: собственное описание (Артем)
***************************************************** }
{процедура удаления лишних пробелов в строке (см. function Sha_SpaceCompress)} var c, i: integer; stt, st, st1: string; begin c := 0; st := edit1.Text;
for i := 1to Length(st) do begin
stt := copy(st, i, 1); if (stt = ' ') and (c >= 1) then begin st1 := st1; c := c + 1; end elseif (stt = ' ') and (c = 0) then begin c := c + 1; st1 := st1 + stt; end elseif (stt <> ' ') then begin c := 0; st1 := st1 + stt; end end;
edit2.text := st1; end; |
Code: |
Function DeleteUselessSpaces(s:String):string; {©Drkb v.3(2007): www. drkb .ru, ®Vit (Vitaly Nevzorov) - nevzorov @ yahoo.com} begin Repeat Result:=s; s:=StringReplace(Result,' ',' ',[rfReplaceAll]); //заменяем все двойные пробелы на одинарные Until Result=s; //повторяем до тех пор пока есть двойные пробелы end; |
- Подробности
- Родительская категория: Работа со строками
- Категория: Форматирование строк
Еще со времен языка FORTRAN у программистов появилась необходимость форматировать строки, направляемые на устройства вывода. Требовался легкий способ для того, чтобы не просто преобразовать число в строку, но также объединить эту строку с другими и включить ее в состав целого предложения.
В Delphi существует группа функций форматирования строк. Их рассмотрение начнем с наиболее часто встречающегося представителя — функции Format:
Code: |
function Format (const Format: string; const Args: arrayofconst) : string; |
Первым параметром функции выступает форматирующая строка. Это — обычная текстовая строка, но в ней на нужных местах стоят специальные символы, которые определяют, какие и как туда будут подставлены параметры.
Второй параметр функции Format называется списком аргументов. Он и содержит "вставляемые" в форматирующую строку параметры. Обратите внимение, что этот открытый массив имеет тип array of const. и в нем может передаваться переменное число разнотипных параметров. Например, после выполнения
Code: |
S := Format('Product %s , version %d.%d', [ 'Borland Delphi' , 1, 0]); |
строке S будет присвоено: Product Borland Delphi , version 1.0. Рассмотрим подробнее правила, по которьм составляется форматирующая строка.
"Специальные" места в ней называются спецификаторами формата и представляют собой следующие конструкции
"%" [index":"] ["-"I [width] ["."prec] type
где обозначены:
• символ -%", с которого начинаются все спецификаторы формата (обязательный);
• поле индекса аргумента [ index " : " ] (необязательное);
• признак выравнивания по левому краю ["-"I (необязательный);
• поле ширины [width] (необязательное);
• поле точности [ - . - prec ] (необязательное);
• символ типа преобразования type (обязательный).
Каждый спецификатор формата соответствует как минимум одному из элементов списка аргументов и определяет, как именно рассматривать его и преобразовывать в строку.
Функция Format поддерживает следующие символы типа преобразования:
d Десятичный Элемент должен быть целым числом и преобразуется в строку десятичных цифр. Если при символе есть поле точности, то в выходной строке будет минимум ргес цифр; если при преобразовании числа их потребуется меньше, то строка дополняется слева нулями.
х Шестнадцатиричный Как тип d, но элемент преобразуется в строку шестнадцатиричных цифр.
е Научный Элемент должен быть числом с плавающей точкой. Он преобразуется к нормализованному виду -d.dddE+ddd. Перед десятичной точкой всегда находится одна цифра (при необходимости, с минусом). После символа "Е" идет показатель степени, имеющий знак и состоящий не менее чем из 3 цифр. Общее число символов в представлении числа определяется полем ргес (по умолчанию 15).
f Фиксированный Элемент должен быть числом с плавающей точкой. Он преобразуется к виду -ddd.ddd. Поле ргес означает количество цифр после десятичной точки (по умолчанию 2).
l Обобщенный Элемент должен быть числом с плавающей точкой. Он преобразуется к одному из двух вышеперечисленных видов — выбирается тот, который обеспечивает более короткую запись. Если требуемое число цифр слева от десятичной точки меньше значения поля ширины и само число больше 10" , применяется фиксированный тип. Удаляются все впереди идущие нули, десятичная точка (при возможности), а также символы, разделяющие строку на группы по три цифры.
п m Числовой Денежный Совпадает с типом f за исключением того, что после каждой группы из трех цифр ставятся разделительные символы: d,ddd, ddd.ddd.... Элемент должен быть числом с плавающей точкой, отражающей денежную сумму. Способ ее представления зависит от значений глобальных констант, определенных в модуле SYSUTILS (см. ниже). В свою очередь, они зависят от настройки Windows на обозначения, принятые в данной стране.
Р Указатель Элемент должен быть указателем. На выходе он будет представлять из себя строку шестнадцатиричных цифр вида ХХХХ: YYYY, где ХХХХ — селектор, YYYY — смещение.
s Строка Элемент может иметь тип string, PChar или быть отдельным символом (Char). Эта строка (или символ) вставляются вместо спецификатора формата. Если присутствует поле ргес и длина строки больше его значения, то она усекается.
Примечания:
1. Форматирующие символы можно задавать как в верхнем, так и в нижнем регистрах.
2. Тип преобразования m (денежный) тесно связан с правилами представления, принятыми в конкретной стране. Для этого в модуле SYSUTILS определены значения ряда типизированных констант, начальные значения которых берутся из секции [Inti] файла WIN.INI. Вы можете изменять их значения в соответствии с вашими потребностями:
CurrencyString: string[7]; Символ (или символы), добавляемые к строке с представлением денежной суммы и обозначающие национальную денежную единицу. Это может быть, например, '$', 'DM' или 'руб'.
CurrencyFormat: Byte; Определяет способ добавления знака денежной единицы к строке. Число 1 будет преобразовано так в зависимости от значения этого параметра: '$!' при 0; '1$' при 1; '$ Г при 2; '1 $' при 3.
NegCurrFormat: Byte; Определяет способ добавления знака денежной единицы и минуса к строке в том случае, если происходит преобразование отрицательного числа (к положительным числам отношения не имеет). Число -1 будет преобразовано так в зависимости от значения этого параметра: '($!)' при 0; '-$!' при 1; '$-1' при 2; '$!-' при 3; '(!$)' при 4; '-!$' при 5; 'i-$' при 6; '!$-' при 7; '-1 $' при 8; '-$ Г при 9; '$ 1-' при 10.
CurrencyDecimals: Byte; Число знаков после запятой в представлении денежных сумм. Например, число 10.15 при разных значениях этого параметра отобразится так: '$10' при 0, '$10.15' при 2, '$10.1500' при 4.
ThousandSeparator: Char; Символ, разделяющий строку на группы по три цифры справа налево (разделитель тысяч). Применяется, в частности, в типе преобразования п.
DecimalSeparator: Char; Символ, отделяющий дробную часть числа от целой.
Мы закончили рассмотрение символа типа преобразования. Рассмотрим остальные составные части спецификатора формата.
Поле шириныустанавливает минимально допустимое количество символов в преобразованной строке. Это означает, что если она короче, чем задано в этом поле, то происходит добавление пробелов до требуемого количества. По умолчанию пробелы добавляются спереди (выравнивание по правому краю), но признак выравнивания по левому краю ("-"; он должен стоять перед полем ширины) позволяет выравнивать строку по-иному.
Поле индекса позволяет динамически изменить последовательность извлечения аргументов из массива. Обычно аргументы извлекаются последовательно, по мере их востребования спецификаторами формата. Поле индекса означает, что следующим нужно извлечь аргумент с данным индексом. Пользуясь индексом, одни и те же аргументы могут быть использованы многократно. Например, вызов Format ( ' %s %s %0 : s %s ', [ 'Yes', 'No' ] ) Даст на выходе строку 'Yes No Yes No'.
Поле точностииграет разную роль в зависимости от того, с каким типом преобразования применяется. Его особенности приведены вместе с описанием типа (с теми из них, где оно имеет смысл).
Поля индекса, ширины и точности могут быть заданы напрямую или косвенно. Первый способ подразумевает явное указание значения поля (например, ' %10 . 5f '). Для косвенного задания значений нужно в соответствующих местах цифры заменить звездочками (например, '%*.*f'). В этом случае вместо звездочек будут подставлены следующие значения из списка аргументов (они обязательно должны быть целыми числами). Например, выражение
Code: |
Format('Value is %*.*',[10,5, 2.718]); |
эквивалентно:
Code: |
Format('Value is %10.5',[2.718]); |
Как уже упоминалось, наиболее употребимой функцией из группы форматирующих является Format, которая работает со строками типа string и максимально освобождает программиста от рутинной работы. Другие функции используют то же ядро и правила преобразования, но отличаются параметрами:
procedure FmtStr(var Result: string; const Format: string; const Args: array of const); To же, что и Format, но оформлено в виде процедуры. Результат преобразования возвращается в параметре Result.
function StrFmt(Buffer, Format: PChar; const Args: array of const): PChar; Форматирующая строка должна находиться в параметре Format, а результирующая помещается в буфер Buffer (он должен иметь нужную длину). Функция возвращает указатель на Buffer.
function StrLFmt(Buffer: PChar; MaxLen: Cardinal; Format: PChar; const Args: array of const) : PChar; Работает как StrFmt, но длина результирующей строки не будет превышать MaxLen символов.
function FormatBuf(var Buffer; BufLen: Cardinal; const Format; FmtLen: Cardinal; const Args: array of const) : Cardinal; Форматирующая строка находится в буфере Format длиной FmtLen, a результирующая — в буфере Buffer длиной BufLen. Функция возвращает число реально помещенных в Buffer символов, причем оно всегда меньше или равно BufLen.
- Подробности
- Родительская категория: Работа со строками
- Категория: Форматирование строк
Code: |
procedure RemoveInvalid(what, where: string): string; // what - удаляемая подстрока, where - обрабатываемая строка var tstr: string; begin tstr:=where; while pos(what, tstr)>0do tstr:=copy(tstr,1,pos(what,tstr)-1) + copy(tstr,pos(what,tstr)+length(tstr),length(tstr)); Result:=tstr; end;
//Применение:
NewStr:=RemoveInvalid('<брак>','Этот <брак> в моей строке, и я хочу удалить из нее этот <брак>'); |
Используйте стандартную функцию Pascal DELETE...
Пользуясь тем же примером, вы можете сделать так....
Code: |
Target:='<брак>'; While POS(Target,string)>0do begin P := POS(Target,string); DELETE(string,P,Length(Target)); end; |
Всё даже проще:
Code: |
{©Drkb v.3(2007): www.drkb. ru, ®Vit (Vitaly Nevzorov) - nevzorov @ yahoo.com} Result:=StringReplace(ИсходнаяСтрока,ТоЧтоНадоУдалить,'',[rfReplaceAll]) |
- Подробности
- Родительская категория: Работа со строками
- Категория: Форматирование строк
Code: |
{ **** UBPFD *********** by delphibase .endimus .com **** >> Функция для удаления из строки "лишних" символов.
Функция для удаления из строки "лишних" символов. Входные параметры: Input - входная строка, которую необходимо очистить от лишних символов EArray - строка, содержащая набор разрешенных или запрещеных символов в зависимости от Action Action - указывает на то, что из себя представляет массив EArray.
Action может принимать следующие значения: 1 - массив EArray представляет собой строку разрешенных символов 2 - EArray - массив запрещенных символов.
Зависимости: делал в Д5, 6 под Win9x Автор: Ru, DiVo_Ru @ rambler.ru, Одесса Copyright: DiVo 2002, creator Ru
***************************************************** }
function strtst(var Input: string; EArray: string; Action: integer): string; begin case Action of 1: begin while length(Input) <> 0do begin if pos(Input[1], EArray) = 0then delete(Input, 1, 1) else begin result := result + Input[1]; delete(Input, 1, 1); end; end; end; 2: begin while length(Input) <> 0do begin if pos(Input[1], EArray) <> 0then delete(Input, 1, 1) else begin result := result + Input[1]; delete(Input, 1, 1); end; end; end; else messagebox(0, 'Не корректный вызов функции.', '', mb_ok); end; end; Пример использования:
// 1. s := edit1.text; s := strtst(s, '0123456789.', 1); edit1.text := s;
// например на входе: 0.16+ // на выходе будет: 0.16
// 2. s := edit1.text; s := strtst(s, '/*-+,', 2); edit1.text := s;
// на входе: 0.16+ // на выходе будет: 0.16 |
- Подробности
- Родительская категория: Работа со строками
- Категория: Форматирование строк
Страница 2 из 2