Fórum [Ajuda Delphi] - Function para colocar virgula em uma string contando da Direita para esquerda. #612923
29/09/2020
0
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
Curtir tópico
+ 0Post mais votado
29/09/2020
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
Gostei + 1
Mais Posts
29/09/2020
Mauricio Gabriel
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.
Gostei + 0
29/09/2020
Emerson Nascimento
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 ) );
Gostei + 1
29/09/2020
Mauricio Gabriel
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.
Gostei + 0
30/09/2020
Raimundo Pereira
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);
Gostei + 1
01/10/2020
Mauricio Gabriel
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 ...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)