Как сделать, чтобы первая буква каждого слова в строке была в верхнем регистре?
function LowCase(ch : CHAR) : CHAR; begin case ch of
'A'..'Z' : LowCase := CHR (ORD(ch)+31);
else
LowCase := ch;
end;
end;function Proper (source, separators : STRING) : STRING; var LastWasSeparator : BOOLEAN;
ndx : INTEGER;
beginLastWasSeparator := TRUE;
ndx := 1;
while (ndx<=Length(source)) do begin
if LastWasSeparator
then source[ndx] := UpCase(source[ndx])
else source[ndx] := LowCase(source[ndx]);
LastWasSeparator := Pos(source[ndx], separators)>0;
inc(ndx);
end;
Result := source;
end;
|
Можно так:
Function TfrmLoadProtocolTable.ToMixCase(InString: String): String; Var I: Integer; Begin Result := LowerCase(InString);
Result[1] := UpCase(Result[1]);
For I := 1 To Length(InString) - 1 Do Begin
If (Result[I] = ' ') Or (Result[I] = '''') Or (Result[I] = '"')
Or (Result[I] = '-') Or (Result[I] = '.') Or (Result[I] = '(') Then
Result[I + 1] := UpCase(Result[I + 1]);
End;
End;
|
Примечание:
Приведенные выше функции вызовут нарушение прав доступа, в случае, если в качестве входного параметра им послать пустую строку (первая функция) или последний символ имеется в проверяемом наборе (вторая функция).
Попробуйте взамен это:
function proper(s:string):string; var t:string; i:integer;
newWord:boolean;
beginif s='' then exit; s:=lowercase(s); t:=uppercase(s); newWord:=true; for i:=1 to length(s) do begin
if newWord and (s[i] in ['a'..'z']) then
begin s[i]:=t[i]; newWord:=false; continue; end;
if s[i] in ['a'..'z',''''] then continue;
newWord:=true;
end;
result:=s;end; |
[000253]