[Ajuda Delphi] - Function para colocar virgula em uma string contando da Direita para esquerda.

29/09/2020

0

Bom dia estimado amigos ... estou iniciando estudos em delphi e estou precisando de uma maozinha.

eu recebo uma string contendo 10 caracteres com numeros apenas ....
exemplo: String : "0000003850"
gostaria de criar uma function Virgula (valor : String , Casasdecimais:String) : String

eu gostaria que a quantidade de casas decimais , seria onde eu quero acrescentar uma virgula dentro da String, contando da direita para esquerda
exemplo : Valor := Virgula(Valor,3);
o Resultado seria :
0000003,850 := Virgula("0000003850",3)
ou seja eu passo o valor para function e onde quero colocar a virgula (quantidade de casas decimais da direita para esquerda).

algum pode me ajudar ? Antecipo cordial agradecimentos. Obrigado !!!
Mauricio Gabriel

Mauricio Gabriel

Responder

Post mais votado

29/09/2020

aparentemente é uma leitura de um arquivo texto para integração de dados.
se for isso, basta transformar o conteudo em valor e dividir por 10 ^ decimais.
mas se quer mesmo incluir a vírgula, não precisa criar uma função. use a função nativa.
  str := '0000003850';
  decimais := 3;
  valor := strtointdef(str,0) / System.Math.Power(10, decimais); // trata do conteúdo como valor
  System.Insert(',',str,length(str)-(decimais-1)); // insere a virgula na string
  showmessage( floattostr( valor ) + #13 + str );

Emerson Nascimento

Emerson Nascimento
Responder

Mais Posts

29/09/2020

Mauricio Gabriel

aparentemente é uma leitura de um arquivo texto para integração de dados.
se for isso, basta transformar o conteudo em valor e dividir por 10 ^ decimais.
mas se quer mesmo incluir a vírgula, não precisa criar uma função. use a função nativa.
  str := '0000003850';
  decimais := 3;
  valor := strtointdef(str,0) / System.Math.Power(10, decimais); // trata do conteúdo como valor
  System.Insert(',',str,length(str)-(decimais-1)); // insere a virgula na string
  showmessage( floattostr( valor ) + #13 + str );


olá Emerson , muito lhe agradeço por sua ajuda !!! ficou show de bola ...
consegui fazer aqui o implemento da sua sugestão e resolveu meu problema.
mas se possivel , poderia me ajudar com uma function ? assim eu poderei aprender como fazer.
se puder agradeço grandemente.
Responder

29/09/2020

Emerson Nascimento

você pode fazer todo o trabalho:
function Virgula(valor: String; Casasdecimais: word): String;
var
  i, cont: word;
begin
  Result := '';
  cont := 0;
  for i := High(Valor) downto Low(Valor) do
  begin
    inc(cont);
    Result := valor[i] + Result;
    if cont = Casasdecimais then
      Result := ',' + Result;
  end;
end;

ou pode fazer uso da função Insert:
function Virgula(valor: String; Casasdecimais: word): String;
begin
  System.Insert(',',valor,length(valor)-(Casasdecimais-1));
  Result := valor;
end;

para testar:
str := '0000003850';
showmessage( Virgula( str, 2 ) );

Responder

29/09/2020

Mauricio Gabriel

você pode fazer todo o trabalho:
function Virgula(valor: String; Casasdecimais: word): String;
var
  i, cont: word;
begin
  Result := '';
  cont := 0;
  for i := High(Valor) downto Low(Valor) do
  begin
    inc(cont);
    Result := valor[i] + Result;
    if cont = Casasdecimais then
      Result := ',' + Result;
  end;
end;

ou pode fazer uso da função Insert:
function Virgula(valor: String; Casasdecimais: word): String;
begin
  System.Insert(',',valor,length(valor)-(Casasdecimais-1));
  Result := valor;
end;

para testar:
str := '0000003850';
showmessage( Virgula( str, 2 ) );





Excelente Emerson !!! Muito obrigado novamente ... essa vai para meu aprendizado ...
Obrigado por compartilhar conhecimento. Espero em breve poder fazer o mesmo para outros.

Responder

30/09/2020

Raimundo Pereira

Bom dia a todos!!

Como mencionado por Emerson Nascimento, você poderia usar as funções nativas

Segue mais uma função para melhoria::

function AplicV(Caractere,Origem: String; Casas : Integer) : String;
var Total_Char:integer;
begin

if Copy(Origem,1,1)=',' then // Verifica se o primeiro caractere é a virgula
begin
Result:='0'+Copy(Origem,1,4);
exit;
end;

if Copy(Origem,1,1)='0' then // Verifica se o primeiro caractere é Zero
begin
Result:='0'+Caractere+Copy(Origem,1,3);
exit;
end;

if (Copy(Origem,1,1)<>'0') and (Copy(Origem,1,1)<>',') and (Length(Origem)>3) then
begin
Origem:=StringReplace(Origem, ',', '',[rfReplaceAll, rfIgnoreCase]);// Retira a virgula para evitar duplicação

Result := ReverseString(Origem);
Result := Copy(Result, 1, Casas);
Total_Char:=Length(Origem)-Casas;
Result :=Copy(Origem,1,Total_Char)+Caractere+ReverseString(Result);

end;
end;


Chamada da Function::
Edit1.Text:=AplicV(',',Edit1.Text,3);
Responder

01/10/2020

Mauricio Gabriel

Bom dia a todos!!

Como mencionado por Emerson Nascimento, você poderia usar as funções nativas

Segue mais uma função para melhoria::

function AplicV(Caractere,Origem: String; Casas : Integer) : String;
var Total_Char:integer;
begin

if Copy(Origem,1,1)=',' then // Verifica se o primeiro caractere é a virgula
begin
Result:='0'+Copy(Origem,1,4);
exit;
end;

if Copy(Origem,1,1)='0' then // Verifica se o primeiro caractere é Zero
begin
Result:='0'+Caractere+Copy(Origem,1,3);
exit;
end;

if (Copy(Origem,1,1)<>'0') and (Copy(Origem,1,1)<>',') and (Length(Origem)>3) then
begin
Origem:=StringReplace(Origem, ',', '',[rfReplaceAll, rfIgnoreCase]);// Retira a virgula para evitar duplicação

Result := ReverseString(Origem);
Result := Copy(Result, 1, Casas);
Total_Char:=Length(Origem)-Casas;
Result :=Copy(Origem,1,Total_Char)+Caractere+ReverseString(Result);

end;
end;


Chamada da Function::
Edit1.Text:=AplicV(',',Edit1.Text,3);



Muito obrigado P2 , em sua colaboração para meu aprendizado ...
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

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

Aceitar