Parse vraag string met 4 cijfers

Status
Niet open voor verdere reacties.

evertVB

Gebruiker
Lid geworden
6 apr 2009
Berichten
570
Ik heb een string en ik wil testen of deze bestaat uit 4 cijfers elk kleiner dan 6.
Als de string hier niet aan voldoet moet er een nette foutmelding komen.
Anders wil ik die cijfers in een array van bytes opslaan.

Voorbeeld:
"Mickey Mouse" is langer dan 4 posities
"Mick" bevat letters
"0627" bevat een 6 en een 7
"0350" is goed en de array van bytes moet worden 0, 3, 5, 0

Wat is de eenvoudigste manier om dit in Java te doen?

Ik vraag dit omdat ik tegen wat beperkingen aan ben gelopen. Chars kun je niet direct naar bytes converteren, en Integer.parseInt werkt niet op chars.
 
Dit is nu mijn code:
Code:
  public byte Char2Digit(char inputChar) {
      switch (inputChar) {
          case '0': return 0;
          case '1': return 1;
          case '2': return 2;
          case '3': return 3;
          case '4': return 4;
          case '5': return 5;
          case '6': return 6;
          case '7': return 7;
          case '8': return 8;
          case '9': return 9;
          default : return -1;
      }
  }
  
  public boolean TryParse(String patternString) {
      initPatternColor();
      
      char patternChar[] = patternString.toCharArray();      

      if (patternChar.length != MastermindBackend.lengthOfPattern) {
          return false;
      }      
      
      for (int i = 0; i < MastermindBackend.lengthOfPattern; i++){
          patternColor[i] = Char2Digit(patternChar[i]);
          if (patternColor[i] < 0 ||
              patternColor[i] >= MastermindBackend.numberOfColors) {
              return false;
          }
      }
      return true;
  }
Het komt wat omslachtig op me over dat ik die conversie in Char2Digit helemaal moet uitschrijven.
 
De klasse String heeft een methode

getBytes(string) die een byte[ ] teruggeeft.

Je zou dus eerst kunnen testen of string.lenth() == 4
En daarna in een loopje het byte[ ] doorlopen en de bytes testen op < 6
 
Een handige manier om dit te doen is met regex

Code:
byte[] run(String input)
{
        String reg = "^[0-6]{4}$";
	if (input.matches(reg))
	{
		return input.getBytes();
	}
	return null;
}

Na aanroep van deze methode kun je dus kijken of de byte array null is, als dat zo is toon je de foutmelding
 
Waarom heb ik niet aan regex gedacht:cool:

Code:
System.out.println("2".getBytes()[0]);
Deze geeft 50 terug in plaats van 2.
 
Dat klopt, dat is de ASCII waarde van de char 2 die je krijgt
 
Dan kan ik dat niet gebruiken. Ik wil van (bijvoorbeeld) "2051" de numerieke waarden 2, 0, 5 en 1 hebben. En dan opgeslagen in byte alleen omdat dat minder geheugen kost dan integer.
 
Op deze manier werkt het (main class niet afgebeeld).

Code:
package regoef;


public class StrFil {
    int gewensteLengte;
    int maxWaarde;
    
    StrFil(int lengte, int nMax){
        gewensteLengte = lengte;
        maxWaarde = nMax;
    }
    
    String filter(String str){
        String foutStr = "invoer niet OK";
        
        if(!(gewensteLengte == str.length()))
            return foutStr;
        
        for(int i = 0; i < gewensteLengte; i++)
        {
            if(!(Byte.parseByte(str.substring(i, i+1)) <= maxWaarde))
                return foutStr;    
        }
        
        return "correcte invoer";
    }   
}
 
Laatst bewerkt:
Thanks!
Voor mijn eigen doeleinden nog even try...catch toegevoegd:

Code:
  public boolean TryParse(String patternString) {
      if (patternString.length() != MastermindBackend.lengthOfPattern) {
          return false;
      }      
      
      for (int i = 0; i < MastermindBackend.lengthOfPattern; i++){
          try {
               patternColor[i] = Byte.parseByte(patternString.substring(i, i+1));
          } catch (Exception e) {
               patternColor[i] = 0;
               return false;
          }
          if (patternColor[i] >= MastermindBackend.numberOfColors) {
              return false;
          }
      }
      return true;
  }
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan