Visualizzazione dei risultati da 1 a 5 su 5

Discussione: [Java] Numeri Decimali

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    34

    [java] Numeri Decimali

    Ciao a tutti.

    Devo gestire una maschera di inserimento di numeri decimali. Ecco cosa ho fatto. In base alla lunghezza del campo a db creo un format in modo dinamico:
    codice:
                  int lunghezza = lunghezzaCampo;
                  String format="";
    
                  for(int i=0;i<=lunghezza;i++){
                    if(i!=lunghezza-decimali){
                      format += "#";
                    }
                    else{
                      format+=".";
                    }
    
         }
         try{
                  JFormattedTextField numDec = new JFormattedTextField(new MaskFormatter(format));
                  numDec.setColumns(lunghezza);
              /*  if(!attuale.isValoriUnici() & attuale.isIncrementante())
                  numDec.setText("1");*/
                  numDec.setEditable(false);
                  numDec.setFocusLostBehavior(JFormattedTextField.COMMIT);
                  textField.add(numDec);
         }catch(Exception th){th.printStackTrace();}
    Non ho problemi nel salvare valori che rientrino nel formato specificato. Se ad esempio è ###.## posso anche salvare 23.32.. Il problema nasce quando lo devo visualizzare dopo aver fatto la query. Il Mask Formatter si aspetta le tre cifre di parte intera e rifiuta il valore. Sapete se c'è un modo per dire al formatter che le cifre sono opzionali?

    In alternativa, sapreste indicarmi che soluzione adottare? Ho provato ad utilizzare un DecimalFormat ma non riesco a capire come bloccare il numero di caratteri inseriti nel JFormattedTextField e come evitare l'inserimento di caratteri che non siano numeri..


    Spero mi possiate aiutare...Grazie!


    Albert

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    34
    Ultimamente i mie messaggi vengono snobbati..chiedo cose troppo difficili??

    Può darsi...

  3. #3
    Per quanto mi riguarda non rispondo solo perchè con i DB non ho molta confidenza altrimenti non avrei problemi...solo che prima di dire cavolate meglio pensarci su bene!
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  4. #4
    Io ho risolto in questo modo.

    Ho creato una classe, RemovePatternCharHandler, che implementa KeyListener ed ho scritto il seguente codice per ogni evento:
    codice:
    // Mostro solo keyPressed, ma vale anche per 
    // keyReleased e keyTyped
    keyPressed(KeyEvent e) {
       try {
       
          javax.swing.text.JTextComponent jTC = (javax.swing.text.JTextComponent) getSource();
          jTC.setText(jTC.getText().replaceAll(pattern,""));
    
    } catch(Exception ex) {}
    
    }

    RemovePatternCharHandler ha un costruttore che setta la variabile patter, privata, che specifica quali caratteri accettare.

    codice:
    public class RemovePatternCharHandler implements KeyListener {
    
    private String pattern = "";
    .
    .
    .
    
    public RemovePatternCharHandler(String pattern) {
        this.pattern = pattern;
    }
    
    }

    A questo punto basta aggiungere ad ogni JTextField un KeyListner in questo modo.

    codice:
    JTextField jTF = new JTextField()
    
    .
    .
    .
    
    jTF.addKeyListener(new RemovePatternCharHandler("[^\\d|.]"));
    In questo modo dovrebbe permettere di inserire solo caratteri di tipo DIGIT ed il punto, solo che permette di metterne più di uno.

    In generale puoi, con una buona espressione regolare, limitare l'inserimento di qualsiasi carattere, ma non formattarlo.

    Che ne dici??

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    34

    Grazie

    Grazie per l'aiuto. Nel frattempo io ho risolto così:
    una volta dati in input lunghezza totale del numero e numero di decimali presenti al document aggiunto al textfield, effettuo dei controlli sugli inserimenti.

    Ecco il codice della classe che estende PlainDocument. Spero possa servire a qualcuno.


    codice:
    public class TipoNumeroDecimale  extends PlainDocument{
    
      private int maxChars;
      private int decimal;
    
    
      public TipoNumeroDecimale(int lunghezza, int decimali){
    
             maxChars=lunghezza+1;
             decimal=decimali;
    
      }
    
         public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
           boolean continua = true;
    
                 if (str.equals(".")){
                   if (getText(0, getLength()).indexOf(".") == -1) {
                     super.insertString(offs, str, a);
    
    
                   }
                   return;
                 }
    
    
           try {
    
                if (str.indexOf(".") != -1){
                  Double.parseDouble(str);
    
                }
                else
                  Integer.parseInt(str);
    
            } catch (NumberFormatException e) {
                continua = false;
              }
    
           if (continua) {
    
             int length = getLength();
             if (length + str.length() <= maxChars) {
               String somma = getText(0, length) + str;
               if (str.length() == 1) {
    
                 if (somma.indexOf(".") != -1) {
                      if (offs > somma.indexOf(".") &
                       decimal < somma.substring(somma.indexOf(".") + 1).length()) {
                     return;
                   }
                   if (offs <= somma.indexOf(".") &
                       maxChars -
                       decimal - 1 <
                       somma.substring(0, somma.indexOf(".") + 1).length()) {
                     return;
                   }
                   super.insertString(offs, str, a);
                 }
                 else{
                   if (maxChars - decimal - 1 < somma.length()) {
                    return;
                  }
                   super.insertString(offs, str, a);
    
    
                 }
               }
    
                 else {
                   super.insertString(offs, str, a);
                 }
               }
               else {
    
                    int allowed = maxChars - length;
                   super.insertString(offs, str.substring(0, allowed), a);
    
               }
    
           }
         }
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2020 vBulletin Solutions, Inc. All rights reserved.