JAVA/JAVA2

[java2] #35 - StringTokenizer, DecimalFomat Class

yoonddo 2022. 11. 23. 14:02

StringTokenizer

사용자가 지정하는 구분자를 경계로 데이터를 분리한다. 구분자를 생략하면 공백과 탭을 기본 구분자로 사용하며
구분자로 구분된 데이터를 Token이라 부른다.
BufferedReader 클래스의 메서드로 입력을 읽어들일땐 라인 단위로 읽어들일 수 밖에 없다. 꼭 BufferedReader 클래스
뿐만 아니라도 콤마, 공백을 기준으로 분리하거나 특정 문자에 따라 문자열을 나누고 싶을 때 StringTokenizer를 사용한다.


StringTokenizer 생성자

StringTokenizer를 생성하는 방식은 3가지가 있다.

//1. 공백 또는 탭으로 문자열 분리
StringTokenizer st = new StringTokenizer(문자열);
 
//2. 구분자(ex: 콤마, 점)를 기준으로 문자열을 분리
StringTokenizer st = new StringTokenizer(문자열, 구분자);
 
/* 3. 구분자를 기준으로 문자열을 분리할 때 구분자도 토큰으로 넣는다. (true)
 * 구분자를 분리된 문자열 토큰에 포함 시키지 않는다. (false)
 * (디폴트 : false)
 */
 StringTokenizer st = new StringTokenizer(문자열 , 구분자 , true/false);


사용 예시

//		1번예시
		String str1 = "사과 배 복숭아		밤 대추";
		StringTokenizer st1 = new StringTokenizer(str1);
//		hasMoreTokens() : StinrgTokenizer 클래스 객체에 다음 토큰이 있으면 true, 없으면 false를 리턴한다.
		while (st1.hasMoreTokens()) { //다음에 읽어들일 토큰이 있는가?
//			nextToken() : StringTokenizer 클래스 객체에서 다음 토큰을 읽어들인다.
			System.out.println(st1.nextToken());
		}
		System.out.println("=============================");
	
//		2번예시		
//		문자열이 ","로 구분된 경우
		String str2 = "사과,배,복숭아,밤,대추";
		StringTokenizer st2 = new StringTokenizer(str2,",");
//		StringTokenizer 클래스 생성자의 2번째 인수로 구분자를 지정할 수 있다.
		while (st2.hasMoreTokens()) {
			System.out.println(st2.nextToken());
		}
		System.out.println("=============================");
//		2번예시
//		문자열이 ","와 "."로 구분된 경우
		String str3 = "사과.배,복숭아.밤,대추";
		StringTokenizer st3 = new StringTokenizer(str3,",.");
//		StringTokenizer 클래스 생성자의 2번째 인수로 구분자를 여러개 지정할 수 있다.
		while (st3.hasMoreTokens()) {
			System.out.println(st3.nextToken());
		}
		System.out.println("=============================");

StringTokenizer 메서드

리턴값 메서드명 역할
boolean hasMoreTokens() 남아있는 토큰이 있으면 true를 리턴, 더 이상 토큰이 없으면 false 리턴
String nextToken() 객체에서 다음 토큰을 읽어들인다.
String nextToken(String delim) delim 기준으로 다음 토큰을 반환
boolean hasMoreElements() hasMoreTokens와 동일한데 엘리먼트보다 토큰으로 된 메서드를 주로 사용
Object nextElement() nextToken 메서드와 동일하지만 문자열이 아닌 객체를 리턴
int countTokens() 총 토큰의 개수를 리턴

DecimalFormat Class

일상에서 가장 많이 쓰이는 진수인 10진수를 형식화하는 역할을 하는 클래스이다.
이 클래스는 NumberFormat을 상속하고있으며 10진수를 다양한 형식에 맞게 출력해줄 수 있다.
DecimalFormat은 java.text 패키지 안에 존재하므로 따로 import 해야한다.
DecimalFormat은 문자'#'과 '0'이 숫자를 나타내는데 쓰이며 쉼표, 마침표, 대시 등으로 숫자 형식을 나타낼 수 있다.

Format 설명
0 10진수, 값이 없는 자리는 0으로 채움
# 10진수, 값이 없는 자리는 나타나지 않음
. 소수점을 이하 나타냄
- 음수 부호를 나타냄
, 단위 구분자를 나타냄
E 지수 기호를 나타냄, E 이후 0를 써서 표현(ex E0)
% 퍼센트 기호
' escape문자, 만약 #을 문자로 나타내고 싶다면 '#' 으로 표현
그외 문자 문자로 취급

  • DecimalFormat을 사용하는 방법은 생성자를 사용해 형식을 지정해주는 방법이 있다
DecimalFormat format=new DecimalFormat("###,###.#######");
format.applyPattern("###,###.#######");


중요한 것은 우리가 패턴을 적용하고 난 후 형식에 맞는 문자열을 뽑아와야 한다. 이때 format이라는 메서드를 사용한다.

double n = 11223344.5678;
String formattedStr = format.format(n);



이제 StringTokenizer와 DecimalFormat을 이용해 과일의 값이 담긴 문자열을 '과일(?,???원)'으로 출력하도록 해보자

//		문자열이 ","와 "="로 구분된 경우
		String str4 = "사과=3000,배=2200,복숭아=900,밤=1000,대추=2200";
//		StringTokenizer 클래스 생성자의 3번째 인수로 구분자를 토큰에 포함시키는 여부를 지정할 수 있다.
//		생략시 기본값은 flase이고 구분자를 토큰에 포함시키지 않는다.
		StringTokenizer st4 = new StringTokenizer(str4,",=",true);
		
//		사과(1,100원) 으로 출력하게 만들기

		DecimalFormat df = new DecimalFormat("#,##0원");
		while (st4.hasMoreTokens()) {
			String str = st4.nextToken();
			if (str.equals("=")) {
				System.out.print("(");
			}else if (str.equals(",")) {
				System.out.println(")");
			}else {
				try {  //가장먼저 사과가 출력되는데 문자열은 정수로 바꿀수 없기 때문에 오류가 난다. 이때 예외처리를 해준다.
				System.out.print(df.format(Integer.parseInt(str)));
				}catch (NumberFormatException e) {
					System.out.println(str);
				}
			}
		}
		System.out.println(")");
  1. ,과 =이 들어가는 자리에 괄호를 넣어야 하기 때문에 StringTokenizer에서 구분자를 토큰에 포함시키도록
    true로 지정한다.
  2. 천의 자리에 콤마를 넣는 형식으로 DecimalFormat 생성자를 사용해 df를 생성한다.
  3. st4에 남아있는 토큰이 있으면 while문을 실행하고 다음 토큰을 읽어들인 후 str에 저장한다.
  4. 저장된 값이 =과 같으면 그 자리에 ( 를 출력하고 ,와 같으면 ) 를 출력한다. 가장 먼저 사과가 출력되는데 문자열은
    정수로 바꿀 수 없기 때문에 오류가 난다. 이때 예외처리를 해준다.


실행결과