[Ajuda Delphi] - Function para colocar virgula em uma string contando da Direita para esquerda.
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
Post 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
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.
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 ) );
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.
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);
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 ...
Clique aqui para fazer login e interagir na Comunidade :)