생각보다는 질문의 내용을 구현하기가 좀 까다롭네요. 겨우 동작하는 버전을 한번 만들어 봤는데, 퍼포먼스나 코드의 복잡도 상으로는 많은 부분 개선되어야할 것 같네요.
private String makeString( int original, double ratio, int wantSize) {
BigDecimal src = BigDecimal.valueOf(original * ratio);
int scale = getDesiredScale(src, wantSize);
BigDecimal value = src.setScale(scale, BigDecimal.ROUND_FLOOR);
int intValue = value.intValue();
int boundaryValue = ( int ) Math.pow( 10 , wantSize);
if (intValue < boundaryValue) {
return value.toString();
}
final String s = String.valueOf(intValue);
return StringUtils.padRight(s.substring( 0 , wantSize), s.length(), '0' );
}
|
전체 메소드는 위와 같습니다.
private int getDesiredScale(BigDecimal src, int maxScale) {
BigDecimal comparison = BigDecimal.TEN;
int scale = 0;
while (scale++ < maxScale && src.compareTo(comparison) > 0) {
comparison = comparison.multiply(BigDecimal.TEN);
}
return maxScale - scale;
}
public class StringUtils {
public static String padRight(String src, int strLength, char padChar) {
if (src == null || src.length() > strLength) {
return src;
}
String paddedStr = "" ;
int padSize = strLength - src.length();
for ( int i = 0 ; i < padSize; i++) {
paddedStr += padChar;
}
return src + paddedStr;
}
}
|
제코드는 겨우 동작하는 최적화된 코드가 아니니, 참고만 하시고 최적화하신 다음 사용하기를 강력 권장합니다. 아이디어만 가져가세요. 코드에 주석도 많이 달았고, 이제 남은 몫은 님의 것이니 제코드 관련해서는 더는 질문은 받지 않겠습니다.