2017-09-30 8 views
1

어제 저는 DecimalFormat 메서드 .format()의 모든 자리 표시 자 및 해당 함수의 동작을 직접 탐색하려고했습니다.
그래서 두 개의 숫자를 써서 서로 다른 패턴을 시도했습니다. "#. ##"을 사용하면 의미없는 모든 0이 잘리고 "0000.00"을 사용하여 번호 앞에 0을 추가했습니다. 그것은 괜찮 았지만, 그런 다음 어떤 일이 일어날지를보기 위해 이상한 패턴을 시도했습니다.
"33333. ##"패턴을 사용하면 최종 출력이 실제로 이상합니다. 당신은 아래에있는 내 코드를 볼 수 있습니다 :DecimalFormat 메서드 .format()을 사용하면 패턴 "33333. ##"이 왜 이상하게 작동합니까?

33222,4732 
33102 

: 번호 등 만 사용 패턴

33332222,47 
-2,0 

같은 입력이. "33033 ##"결과를 주었다

DecimalFormat df = new DecimalFormat("33332.##"); 
double a= 222.46705219; 
double b=-102.000; 

System.out.println(df.format(a)); 
System.out.println(df.format(b)); 

그리고이었다 출력 나는 프로그램이 0 대신에 포맷 된 숫자를 추가했음을 이해하지만 왜 0이 자리 표시 자로 제시되지 않을지라도이 방법은 여전히 ​​첫 번째 숫자와 (분명히) 두 번째 숫자를 반올림합니까?
왜 첫 번째 숫자는 두 번째 숫자로 반올림되었지만 두 번째 숫자 (b)는 끝에 0이 인쇄 되었습니까?
그리고 0- 자리 표시자가 "33033. ##"의 중간에 표시 될 때 프로그램은 그 자리에 형식 번호 a를 삽입하지만 번호 b의 끝에 "33"을 인쇄하지 않습니다.
이 동작을 설명하는 방법을 모르겠습니다.

답변

0

documentation은 설정해야하는 패턴에 대한 명확한 구문을 강조 표시합니다. 두 형식 모두 필요한 구문을 따르므로 결과를 신뢰할만한 것으로 보지 않아야하며 이후 버전에서 변경 될 수 있습니다. 솔직히 말해서 생성자가 이러한 형식으로 예외를 throw하지 않는다는 것에 놀랐습니다.

33332.## 다음 33332는 접두사로 볼 수 있습니다, 그리고 중 하나 0 또는 #은 소수점 전에 필요로 나머지, .##은 유효하지 않습니다.

33033.## : 은 접두사로 표시되며 033.##입니다. 0, .#은 어떤 접두사 또는 접미사에도 사용할 수 없으며 3은 접두어 또는 접미사의 일부일 수 있으며이 패턴은 유효하지 않습니다.

+0

그래, 나는 그것이 유효하지 않다는 것을 알고있다. 그러나 그것은 모든 패턴이 숫자 a를 숫자 b와 다른 방식으로 취급하는 이유를 설명하지 못한다. 예제를보십시오 - 패턴 "33332. ##"은 소수점 구분 기호 뒤에 두 번째 숫자로 포맷 된 "a"를 인쇄하지만 "b"는 첫 번째 숫자로 포맷됩니까? –

+0

내가 말하고자하는 것은 그것이 유효하지 않기 때문에 결과가 예측할 수 없다는 것입니다. 여러 가지 이유가있을 수 있으며, 경고없이 변경되지 않는다고 믿을만한 이유가 없습니다. –