GARANTIR DESCONTO

Fórum Incrementar String #143534

09/03/2003

0

Bom Dia.

Utilizo a linguagem ADVPL e nela tem uma função chamada soma1(String) que faz o seguinte:

string := ´01´ ;
string := soma1(string);
string passa a ser ´02´

Outro exemplo:

string := ´99´ ;
string := soma1(string);
string passa a ser ´A0´
Depois ´A1´ e ai vai.

Se alguém souber de uma função semelhante ou tem algum código que faça isso.

Atento que a função trata strings de qualquer tamanho.

Valew.


Doug_chagas

Doug_chagas

Responder

Posts

09/03/2003

Orlando Frade

function soma1(Num: String): String;
// Função criada por Orlando Frade em 09/03/2003
var
n: Integer;
begin
// Faz um teste com a string para saber se ela é realmente um inteiro
Try
n := StrToInt(Num);
Except
On EConvertError Do
begin
MessageBox(Handle,´A string não é um inteiro.´,´Error´,MB_ICONERROR+MB_OK);
result := Num;
Exit;
end;
end;
// Fim do teste
n := n + 1;
result := IntToStr(n);
end;

é + ou - assim. Não entendi como funciona aquele ´A´ se você me der mais detalhes eu termino o código.

Um Abraço
Orlando Frade

Bom Dia. Utilizo a linguagem ADVPL e nela tem uma função chamada soma1(String) que faz o seguinte: string := ´01´ ; string := soma1(string); string passa a ser ´02´ Outro exemplo: string := ´99´ ; string := soma1(string); string passa a ser ´A0´ Depois ´A1´ e ai vai. Se alguém souber de uma função semelhante ou tem algum código que faça isso. Atento que a função trata strings de qualquer tamanho. Valew.



Responder

Gostei + 0

09/03/2003

Doug_chagas

Aquele A é pq a string tem que ser alfanuméria. os caracteres correm de 0 ´a Z. Entendeu agora. Essa função que vc fez só resolve para numeros inteiros. Nem serve.



[quote:6fafe1f1d7=´Orlando Frade´]function soma1(Num: String): String;
// Função criada por Orlando Frade em 09/03/2003
var
n: Integer;
begin
// Faz um teste com a string para saber se ela é realmente um inteiro
Try
n := StrToInt(Num);
Except
On EConvertError Do
begin
MessageBox(Handle,´A string não é um inteiro.´,´Error´,MB_ICONERROR+MB_OK);
result := Num;
Exit;
end;
end;
// Fim do teste
n := n + 1;
result := IntToStr(n);
end;

é + ou - assim. Não entendi como funciona aquele ´A´ se você me der mais detalhes eu termino o código.

Um Abraço
Orlando Frade

Bom Dia. Utilizo a linguagem ADVPL e nela tem uma função chamada soma1(String) que faz o seguinte: string := ´01´ ; string := soma1(string); string passa a ser ´02´ Outro exemplo: string := ´99´ ; string := soma1(string); string passa a ser ´A0´ Depois ´A1´ e ai vai. Se alguém souber de uma função semelhante ou tem algum código que faça isso. Atento que a função trata strings de qualquer tamanho. Valew.
[/quote:6fafe1f1d7]


Responder

Gostei + 0

09/03/2003

Adilsond

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function Soma1(Value: String): String;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.Soma1(Value: String): String;
var
fValue1,
fValue2: Byte;
begin
fValue1 := Ord(Value[1]);
fValue2 := Succ(Ord(Value[2]));
if not (fValue2 in [Ord(´0´)..Ord(´9´)]) then
begin
if fValue1 = Ord(´9´) then
fValue1 := Ord(´A´)
else
begin
Inc(fValue1);
if fValue1 > Ord(´Z´) then
fValue1 := Ord(´0´);
end;
fValue2 := Ord(´0´);
end;
Result := Chr(fValue1) + Chr(fValue2);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text := Soma1(Edit1.Text);
end;

end.


Responder

Gostei + 0

09/03/2003

Dagalvani

:?

Interessante! Incrementar string neste caso está se referindo a passar para próxima sentença lógica utilizada (0,1,2,...;a,b,c,d,...).

Então vamos ver essa operação como uma de somar, 1+1=2, ou melhor somar valores, neste caso, somar 1 ou ir para o próximo.

[size=18:c3e9a9e8e4]>> É a característica típica do números [b:c3e9a9e8e4]Hexadecimais[/b:c3e9a9e8e4]![/size:c3e9a9e8e4]

Fatos:
Os números Hexa tem 16 (Base 16) valores, de 0 à F, onde F = 15 em decimal.
Quando se chega ao 9 ao invés do 10 (como em decimal) vem o A.
Todas notação numérica têm casa [b:c3e9a9e8e4]Unidades, Dezenas, Centenas[/b:c3e9a9e8e4], ...
Quando contamos 10, adicionamos +1 na próxima casa da esquerda.
Como a sequência é de 0 à 9 e seguida de A à Z, temos uma Base de 26 letras(A..Z) + 10 números(0..9) = 36 algarismos - Base 37.

Decimal = Nossa sequência
0 = 0
1 = 1
2 = 2
.
.
.
9 = 9
10 = A
11 = B
.
.
15 = F Os Nº Hexa vem até aqui, depois
16 = 10 <- Valor em Hexa, no nosso caso continua...
16 = G
17 = H
.
.
36 = Z E finalmente virar
37 = 10 Porquê?

[size=9:c3e9a9e8e4]1[/size:c3e9a9e8e4]
9
+ 1
=10
9 mais 1 sobe 1 e escorrega = 10 a casa da direita voltou ao zero e a da esquerda ganhou 1 como não tinha nenhum nº na esq. é como se fosse 0 + 1 = 1.

Então vamos ao que interessa.
Existe uma função no Delphi em que você dá um valor e sua base ele retorna um valor, você poderá dar o valor [b:c3e9a9e8e4]atual +1[/b:c3e9a9e8e4], na base 37.

Desculpe mas não lembro qual, no programinha DelphiBoy está discriminado, procure na Net. Assim que puder volta para teclar o comando, se o encontrar.


Responder

Gostei + 0

09/03/2003

Doug_chagas

Muito boa a função. Li seu fonte e não consegui. Preciso que ao chegar a ´ZZ´ ele não pule pra ´00´ e sim ´100´. Quando chegar em ´1ZZ´, ´200´.
´ZZZ´, ´1000´.

Por favor me ajude.

Valew.




unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } function Soma1(Value: String): String; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} function TForm1.Soma1(Value: String): String; var fValue1, fValue2: Byte; begin fValue1 := Ord(Value[1]); fValue2 := Succ(Ord(Value[2])); if not (fValue2 in [Ord(´0´)..Ord(´9´)]) then begin if fValue1 = Ord(´9´) then fValue1 := Ord(´A´) else begin Inc(fValue1); if fValue1 > Ord(´Z´) then fValue1 := Ord(´0´); end; fValue2 := Ord(´0´); end; Result := Chr(fValue1) + Chr(fValue2); end; procedure TForm1.Button1Click(Sender: TObject); begin Edit2.Text := Soma1(Edit1.Text); end; end.



Responder

Gostei + 0

09/03/2003

Adilsond

A função abaixo faz o seguinte:

passa o ´00´ p/ ´01´
passa o ´01´ p/ ´02´
...
passa o ´09´ p/ ´0A´
passa o ´0A´ p/ ´0B´
...
passa o ´0Z´ p/ ´10´
passa o ´10´ p/ ´11´
...
passa o ´19´ p/ ´1A´
passa o ´1A´ p/ ´1B´
...
passa o ´9Z´ p/ ´A0´
passa o ´A0´ p/ ´A1´
...
passa o ´ZZ´ p/ ´100´
passa o ´100´ p/ ´101´
...
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
function GetSucc(Value: Char): Char;
function Soma1(Value: String): String;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

function TForm1.GetSucc(Value: Char): Char;
begin
if Value = ´9´ then
Result := ´A´
else
if Value = ´Z´ then
Result := ´0´
else
Result := Chr(Succ(Ord(Value)));
end;

function TForm1.Soma1(Value: String): String;
var
I: Word;
ValZerado: Boolean;
begin
Result := Value;
for I := Length(Value) downto 1 do
begin
Result[I] := GetSucc(Value[I]);
if Result[I] <> ´0´ then
Break;
end;
ValZerado := True;
for I := Length(Value) downto 1 do
begin
if Result[I] <> ´0´ then
begin
ValZerado := False;
Break;
end;
end;
if ValZerado then
Result := ´1´ + Result;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := Soma1(Edit1.Text);
end;

end.


Responder

Gostei + 0

20/01/2004

By Alemão

Também trabalho com ADVPL e agora preciso desta mesma função de SOMA1.

esta que esta descrita soma apenas para 2 digitos.

Como que faço para utilizar a SOMA1 para 4 digitos ou mais????


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar