Remove Insignificant Zeros From a Number Represented as a String
1. 소개
이 튜토리얼에서는 문자열로 표현된 숫자에서 의미 없는 0을 제거하는 방법, 즉 앞과 뒤의 0을 포함하여 학습할 것입니다. 우리는 이를 달성하는 여러 가지 방법을 탐색할 것이며, 표준 코어 자바 패키지를 사용하는 방법도 포함됩니다.
각 구현에 대해 긍정적 및 부정적 숫자 문자열의 예를 살펴보겠습니다.
2. String.replaceAll()
사용하기
먼저 String
의 replaceAll()
메서드에 대해 살펴보겠습니다. replaceAll()
메서드는 정규식 패턴을 사용하여 내용을 대체합니다. 우리는 replaceAll()
메서드를 호출하여 문자열의 앞과 뒤에서 0을 제거할 것입니다.
우리는 문자열의 시작이나 끝에서 모든 0과 빈 문자열로 대체되길 원합니다. 먼저, 문자열에 점(.) 문자가 포함되어 있는지 확인 후, 입력에서 앞과 뒤의 0을 제거하기 위해 replaceAll()
메서드를 재귀적으로 호출해야 합니다. 그렇지 않으면 우리는 문자열의 시작에서만 0을 제거해야 합니다.
더 나은 이해를 위해 소수점 숫자의 예를 들어보겠습니다:
@Test
public void givenPositiveNumberString_whenUsingStringReplaceAll_thenInsignificantZeroRemoved() {
String positiveNumber = "001200.35000";
positiveNumber = positiveNumber.contains(".") ? positiveNumber.replaceAll("^(-?)0+(\\d+)", "$1$2")
.replaceAll("0+$", "")
.replaceAll("\\.$", ".0") : positiveNumber.replaceAll("^(-?)0+(\\d+)", "$1$2");
assertEquals("1200.35", positiveNumber);
}
@Test
public void givenNegativeNumberString_whenUsingStringReplaceAll_thenInsignificantZeroRemoved() {
String negativeNumber = "-0015.052200";
negativeNumber = negativeNumber.contains(".") ? negativeNumber.replaceAll("^(-?)0+(\\d+)", "$1$2")
.replaceAll("0+$", "")
.replaceAll("\\.$", ".0") : negativeNumber.replaceAll("^(-?)0+(\\d+)", "$1$2");
assertEquals("-15.0522", negativeNumber);
}
여기에서 첫 번째 replaceAll()
메서드 호출은 문자열의 시작 부분에서 모든 0을 제거하는 역할을 합니다. 만약 부호가 포함되어 있다면, 우리는 해당 부호를 숫자와 함께 유지해야 합니다. 두 번째 호출은 문자열의 끝에서 뒤따르는 0을 제거합니다. 세 번째 호출은 문자열의 끝에 점만 남아있는지 확인합니다. 만약 그렇다면, 우리는 이를 “.0″으로 대체하여 소수점 숫자를 보장합니다.
결과적으로, 우리는 시작과 끝에서 0이 없는 필요한 문자열을 얻게 됩니다.
3. DecimalFormat
사용하기
DecimalFormat
클래스는 숫자를 우리의 요구에 맞춰 형식을 지정할 패턴을 제공할 수 있게 해줍니다. 유일한 제한은 주어진 패턴에 따라 소수점 뒤의 숫자 수를 제한한다는 점입니다.
우리는 DecimalFormat
을 사용하여 의미 없는 0을 제거할 것입니다. 우리는 또한 DecimalFormat
에 패턴을 제공할 것입니다:
@Test
public void givenPositiveNumberString_whenUsingDecimalFormat_thenInsignificantZeroRemoved() {
String positiveNumber = "001200.35000";
positiveNumber = new DecimalFormat("0.0#####").format(Double.valueOf(positiveNumber));
assertEquals("1200.35", positiveNumber);
}
@Test
public void givenNegativeNumberString_whenUsingDecimalFormat_thenInsignificantZeroRemoved() {
String negativeNumber = "-0015.052200";
negativeNumber = new DecimalFormat("0.0#####").format(Double.valueOf(negativeNumber));
assertEquals("-15.0522", negativeNumber);
}
우리는 패턴을 제공하여 DecimalFormat
인스턴스를 생성했고, 이 패턴을 사용하여 주어진 문자열을 형식화할 것입니다. 패턴에서 “#”를 사용했으며, 이는 0이 아닌 숫자가 있을 경우 출력을 포함하거나 제거하겠다는 의미입니다. 패턴에서 “#”의 수는 이만큼 소수점 아래의 최대로 형식을 지정하겠다는 것을 의미합니다.
결과적으로 우리는 시작과 끝에서 0이 없는 문자열을 얻게 됩니다.
4. BigDecimal
사용하기
BigDecimal
클래스는 주어진 문자열에서 의미 없는 0을 제거하는 메서드를 제공합니다. BigDecimal의 초기화는 기본적으로 문자열에서 앞의 0을 제거합니다. BigDecimal
은 문자열에서 뒤따르는 0을 제거하는 stripTrailingZeros()
메서드를 제공합니다. 소수점 숫자에서 뒤따르는 0을 제거한 후, 분수 부분이 비어 있다면 우리는 소수점 없이 숫자를 얻게 됩니다:
@Test
public void givenPositiveNumberString_whenUsingBigDecimal_thenInsignificantZeroRemoved() {
String positiveNumber = "001200.35000";
positiveNumber = new BigDecimal(positiveNumber).stripTrailingZeros().toPlainString();
assertEquals("1200.35", positiveNumber);
}
@Test
public void givenNegativeNumberString_whenUsingBigDecimal_thenInsignificantZeroRemoved() {
String negativeNumber = "-0015.052200";
negativeNumber = new BigDecimal(negativeNumber).stripTrailingZeros().toPlainString();
assertEquals("-15.0522", negativeNumber);
}
우리는 숫자의 문자열을 인수로 하여 BigDecimal
인스턴스를 생성한 다음, 뒤따르는 모든 0을 제거하기 위해 stripTrailingZeros()
메서드를 호출합니다. 마지막으로, 우리는 유의미한 0만 있는 문자열을 반환하는 toPlainString()
메서드를 호출합니다.
5. 결론
이 기사에서는 문자열에서 의미 없는 0을 제거하는 다양한 방법을 탐색했습니다. 또한 각 접근 방식의 다양한 제한 사항에 대해서도 설명했습니다. 우리는 숫자 표현의 특정 요구 사항에 따라 접근 방식을 선택해야 합니다.
이 기사에 포함된 모든 코드는 GitHub에서 확인하실 수 있습니다.