String contar digitos

11 respostas
fabiodurgante

seguinte quero fazer uma string digitada EX: 1.547,42

quero fazer ela contar quantos dígitos possui no caso 2 o (.)ponto e a (,)virgula

public boolean ehInteiro( String s ) {    
  
    // cria um array de char    
    // char[] c = s.toCharArray();    
    boolean d = true;    
  
    for ( int i = 0; i < s.length(); i++ ) {   
        // verifica se o char não é um dígito    
        if ( !Character.isDigit( s.charAt(i) ) ) {    
            d = false;    
            break;    
        }    
    }    
  
return d;    
  
}

esse codigo verifica se é digito ou nao mas preciso limitar a somente 2 digitos no caso o (.)ponto e a (,)virgula se ja foi digitado mais que 2 RETURN como poderia fazer isso ??

11 Respostas

fabiodurgante
public Integer contar_letras(String x) {                
                for(int i=0; i<x.length();i++){
                 char ch = x.charAt(i);
                    String x1 = String.valueOf(ch);
                 if(x1.equalsIgnoreCase(".") || (x1.equalsIgnoreCase(","))){
                        total++;

                    }
                }
System.out.print(total);
             return(total);
    }  
}

isso ai conta certo porem preciso fazer se tiver mais de 2 letras e eu apagar no jtextfield as letras ele nao zera o total

suelengc

Olá fabiodurgante!

Deixa eu ver se entendi bem sua dúvida, você precisa contar os dígitos de um número que será recebido como tipo String e se for mais de 2 dígitos (, +. ou . + . ou , + , ou etc.)você deseja retornar “false”, está certo?

Abraços

fabiodurgante

isso mesmo assim olha so

if(str.equals(".") || str.equals(","))

    
if(str.indexOf(",")> -1){
 


}

preciso que entre no IF somente se tiver 1 unica (,)virgula entendeu se tiver 1 virgula entra no if, se eu apagar a virgula do jtextfield ai posso novamente entrar no IF

suelengc

Olá fabiodurgante!

Se seu problema foi o que mencionei, acredito que o código abaixo seja uma sugestão de solução:

public class guj2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if (TemMaisQueDoisDigitos("1.547,42."))
			System.out.println("Tem mais q 2 ");
		else
			System.out.println("Tem ate 2 ");

	}

	public static boolean TemMaisQueDoisDigitos(String x) {                  
		int qtdDigitos = 0;
		
		for (int i = 0; i < x.length(); i++) {  
	        char dig = x.charAt(i);  
	        if(dig == '.' | dig == ',') {
	        	
	        	if (++qtdDigitos > 2) {
	        		return true;
	        	}
	        }  
        }  
		
        return false;  
	}     
}

Já sobre o “outro” problema, de pegar o valor do JTextField que está em uma classe e passar para outra, eu vejo duas opções:

  1. Você pode criar um listener para ele e setar este listener ou
  2. Você pode recuperar na sua classe atual via getText() mesmo, e passar como parâmetro para a classe.método que você precisa…

Bem, espero ter ajudado mesmo sem entender ao certo seu problema rsrsrs

Se tiver mais dúvidas, posta seu código todo aqui (pelo menos os das classes em questão) assim fica mais fácil te ajudar.

Abraços!

fabiodurgante

toda a classe essa classe so aceita numeros e 1 ponto e 1 virgula o que nao consegui fazer ate agora, ela agora aceita somente numeros virgulas e pontos quantos quizer, quero numero quantos quizer e 1 ponto e 1 virgula

package jtextfield_somente_numero;

import javax.swing.*;
import javax.swing.text.*;

public class JMoneyTextField extends JFormattedTextField{


public JMoneyTextField(){

setDocument(new NumberDocument());

}
public class NumberDocument extends PlainDocument{

public NumberDocument(){
super();

}
public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
//permite apenas uma virgula
if(str.equals(".") || str.equals(","))

    
if(str.indexOf(",")> -1){
     super.insertString(offset, str, attr);

}


if (str.codePointAt(0) < 48 || str.codePointAt(0) > 57)   return;
super.insertString(offset, str, attr);
}
}


}  



//USES  jtextfield > personalizar codigo > criacao personalizada > new JMoneyTextField()
JuniorMaia

Vamos lá:

for (char c : s.toCharArray()) { int contador = 0; if(c.equals(".") || c.equals(",")) { contador++; if(contador > 2) { //aqui vc implementa teu código para retornar o erro ou o que tu quiser } } //aqui passou, tem 2 ou menos caracteres , ou . }

Explicando:

Aqui você atribui pro char c cada carcter da tua string

for (char c : s.toCharArray()) {

Depois cria um contador de caracteres

Aqui você verifica cada caracter se é , ou .

if(c.equals(".") || c.equals(",")) {

Quando o contador passar 2

contador++; if(contador > 2) { //aqui vc implementa teu código }

Você trata como quiser

suelengc

Este permite apenas 1 único “ponto” e 1 única “vírgula”…

public class guj2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if (NumeroValido("1.547.42")) 
			System.out.println("Válido");
		else
			System.out.println("Inválido");
	}

	public static boolean NumeroValido(String x) {  
		boolean retorno = true;
		int ponto =0, virgula = 0;
		
		for (int i = 0; i < x.length(); i++) {  
	        
			switch (x.charAt(i)) {
			case '.':
				ponto++;
				break;
			case ',':
				virgula++;
				break;
			}
			
			if (ponto > 1 | virgula > 1) {
				retorno = false;
			}
        }  
		return retorno;

	}     
}
suelengc

Versão melhorada (e código mais limpo com a sugestão do for do JuniorMaia) da função…

public static boolean ehNumeroValido(String x) {  

		int ponto =0, virgula = 0;
		
		for (char c : x.toCharArray()) {  
	        
			switch (c) {
			case '.':
				ponto++;
				break;
			case ',':
				virgula++;
				break;
			}
			
			if (ponto > 1 | virgula > 1) {
				return false;
			}
     }  
		return true;
	}
fabiodurgante

valeuu suelengc esse seu numero valido no meu contexto nao funcionou nao mas valeu iguallll

JuniorMaia

ambos iram funcionar :stuck_out_tongue_winking_eye:
basta adaptar para o código, já lhe foi dado a vara e o lago, basta pescar.

suelengc

Olá fabiodurgante!

Que bom que ajudei! Depois se puder, poste aqui sua solução :wink:

Abraços!

Criado 16 de maio de 2012
Ultima resposta 16 de mai. de 2012
Respostas 11
Participantes 3