Duvida Substring

Olá,

estou com o seguinte problema, quero fazer uma limitação de valores em uma variavel, quero que ele somente mostre os dois valores depois do ponto, por exemplo: 000.00

Estou tentando fazer o mesmo com Substring, porem não estou achando a lógica certa p/ verificar se tem realmente os 2 valores depois do ponto, ou se tem o ponto.

Da maneira que esta meu código ele da o seguinte erro:
Exception in thread “AWT-EventQueue-0” java.lang.StringIndexOutOfBoundsException: String index out of range: 9

Na linha de código abaixo:
valordaVenda = valordaVenda.substring(0, X + 3);

Provavelmente o erro ocorre pq não deve ter 2 valores depois do ponto.

Estou fazendo da seguitne maneira abaixo:

      //valorVenda é um bigdecimal que contem um valor, como por exemplo "100.10 ou 10 ou 100.1"
      valordaVenda = valorVenda.toString();
                         
                 //aqui setamos o contador com o tamanho da string
                int cont = valordaVenda.length();
                //percorremos a string
                for(int X = 0; X<cont; X++){
                    //verificamos onde esta o . dentro da string
                    if(valordaVenda.charAt(X) == '.'){
                        

                        
                        //valordaVenda = valordaVenda.substring(0, X+3);
                        
                        //substring(X, X+1).equals(".")){
                        //substring é o resultado de um pedaço da sua string original
                        
                        
                        if (valordaVenda.substring(X+1, valordaVenda.length()).length() == 0){
                            valordaVenda.concat("000");
                        } else if (valordaVenda.substring(X+1, valordaVenda.length()).length() == 1){
                            valordaVenda.concat("00");
                        } else if (valordaVenda.substring(X+1, valordaVenda.length()).length() == 2){
                            valordaVenda.concat("0");
                        }

                        //aqui pedimos para ele pegar o pedaço da strig que começa no 0
                        //e termina 3 casas a partir do . que ele achou
                        valordaVenda = valordaVenda.substring(0, X + 3);
                        break;

                      //tentei fazer da seguinte maneira abaixo mais não tive sucesso
//                        if (valordaVenda.substring(X, X + 2).equals("")) {
//                            Utils.msg("x+1:" + valordaVenda.substring(0, X + 1));
//                            valordaVenda = valordaVenda.substring(0, X + 1);
//                            break;
//                        } else if (valordaVenda.substring(X, X + 3).equals("")) {
//                            
//                            Utils.msg("x+2:" + valordaVenda.substring(0, X + 2));
//                            valordaVenda = valordaVenda.substring(0, X + 2);
//                            break;
//                        }else{
//                            Utils.msg("x+3:" + valordaVenda.substring(0, X + 3));
//                            valordaVenda = valordaVenda.substring(0, X + 3);
//                            break;
//                        }                        
                        

                    }
                }

[quote=wesleypc]Olá,

estou com o seguinte problema, quero fazer uma limitação de valores em uma variavel, quero que ele somente mostre os dois valores depois do ponto, por exemplo: 000.00

[/quote]

  1. Que complicação - você pode usar DecimalFormat, ou então String.format ("%.2f"), com BigDecimal sem problemas.

  2. Se realmente precisar de fazer uma coisa dessas, então crie um método separado. Evite fazer copy & pasta adoidado - ou você ganha por linha de código?

  3. Você vai tomar na cabeça se tiver 2 variáveis com nomes ligeiramente parecidos (como valorVenda e valordaVenda) com tipos diferentes.
    Se por algum motivo você precisa ter 2 variáveis com o mesmo valor mas tipos diferentes, use algo para diferenciá-las que seja padronizado, como um prefixo (embora, é claro, eu não seja a favor desse tipo de coisa). No seu caso, você pode usar “strValorVenda” para indicar que esse é o valor string da variável numérica “valorVenda”.)

Olá entanglement,

sera que vc poderia postar um exemplo de como ficaria com o DecimalFormat, ou então com o String.format ?

E como ficaria a verificação se tem valores depois do “.” ou não para que não ocorra o erro q esta dando: Exception in thread “AWT-EventQueue-0” java.lang.StringIndexOutOfBoundsException: String index out of range: 9

Grato pela ajuda.

package guj;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.util.Locale;

public class FormatarCom2Casas {
    public static void main(String[] args) throws Exception {
        BigDecimal valorVenda = new BigDecimal("-12345.678"); // você quer imprimir como "-12.345,68" (note o arredondamento)
        DecimalFormat df;
        String strValorVenda;
        
        strValorVenda = String.format("%.2f", valorVenda);
        System.out.println(strValorVenda); // resultado: -12345,68
        
        strValorVenda = String.format("%(.2f", valorVenda);
        System.out.println(strValorVenda); // resultado: (12345,68)
        
        strValorVenda = String.format("%,.2f", valorVenda);
        System.out.println(strValorVenda); // resultado: -12.345,68
        
        strValorVenda = String.format("%(,.2f", valorVenda);
        System.out.println(strValorVenda); // resultado: (12.345,68)
        
        strValorVenda = String.format(Locale.US, "%.2f", valorVenda);
        System.out.println(strValorVenda); // resultado: -12345.68
        
        strValorVenda = String.format(Locale.US, "%,.2f", valorVenda);
        System.out.println(strValorVenda); // resultado: -12,345.68
        
        strValorVenda = String.format(new Locale("pt", "BR"), "%.2f", valorVenda);
        System.out.println(strValorVenda); // resultado: -12345,68
        
        strValorVenda = String.format(new Locale("pt", "BR"), "%,.2f", valorVenda);
        System.out.println(strValorVenda); // resultado: -12.345,68
        
        df = (DecimalFormat) NumberFormat.getCurrencyInstance();
        strValorVenda = df.format (valorVenda);
        System.out.println(strValorVenda); // resultado: -R$ 12.345,68
        
        df = new DecimalFormat ("0.##");
        strValorVenda = df.format (valorVenda);
        System.out.println(strValorVenda); // resultado: -12345,68
        
        df = new DecimalFormat ("0.##", new DecimalFormatSymbols (Locale.US));
        strValorVenda = df.format (valorVenda);
        System.out.println(strValorVenda); // resultado: -12345.68
        
        df = new DecimalFormat ("0.##", new DecimalFormatSymbols (new Locale ("pt", "BR")));
        strValorVenda = df.format (valorVenda);
        System.out.println(strValorVenda); // resultado: -12345,68
        
        df = new DecimalFormat ("#,##0.##");
        strValorVenda = df.format (valorVenda);
        System.out.println(strValorVenda); // resultado: -12.345,68
        
        df = new DecimalFormat ("#,##0.##", new DecimalFormatSymbols (Locale.US));
        strValorVenda = df.format (valorVenda);
        System.out.println(strValorVenda); // resultado: -12,345.68
        
        df = new DecimalFormat ("#,##0.##;(#,##0.##)");
        strValorVenda = df.format (valorVenda);
        System.out.println(strValorVenda); // resultado: (12.345,68)
        
        df = new DecimalFormat ("#,##0.##;(#,##0.##)", new DecimalFormatSymbols (Locale.US));
        strValorVenda = df.format (valorVenda);
        System.out.println(strValorVenda); // resultado: (12,345.68)
    }
}

Muito obrigado entanglement , era realmente isso que eu queria, mato aquelas mil linhas q eu tinha por duas linha de código…
hahaha

Obrigadão mesmo.

[quote=wesleypc]Muito obrigado entanglement , era realmente isso que eu queria, mato aquelas mil linhas q eu tinha por duas linha de código…
hahaha

Obrigadão mesmo.[/quote]

Sem contar que por mais que você ficasse tentando, as 1000 linhas estariam erradas, já que o esperado é que arredonde o valor, não que trunque o valor.