마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

EditText에서 숫자 받고 곱한 값에서 숫자 자르고 뒤에 0 붙이기

0 추천
예를 들어서

EditText로 숫자 값을 받는데 거기에 0.003을 곱한 값을 TextView로 보여줘야합니다.

1 * 0.003 = 0.003

12 * 0.003 = 0.036

123 * 0.003 = 0.369

1234 * 0.003 = 3.702

123456 * 0.003 = 370.368 -> 370.3

1234567 * 0.003 = 3703.701 -> 3703

12345678 * 0.003 = 37037.034 -> 37030

123456789 * 0.003 = 370370.367 -> 370300

 

앞에 4자리 숫자만 뽑고 뒤에는 0으로 채우고 싶습니다.
sosososos (180 포인트) 님이 2020년 12월 3일 질문

1개의 답변

0 추천

생각보다는 질문의 내용을 구현하기가 좀 까다롭네요. 겨우 동작하는 버전을 한번 만들어 봤는데, 퍼포먼스나 코드의 복잡도 상으로는 많은 부분 개선되어야할 것 같네요.

 

private String makeString(int original, double ratio, int wantSize) {
        BigDecimal src = BigDecimal.valueOf(original * ratio); //eg. 1 * 0.003

        // 해당 숫자를 원하는 자리수 만큼 자르려면 소수점 몇자리를 사용해야 하는지 구한다.
        int scale = getDesiredScale(src, wantSize);

        // 위에 구한 소수점 자리수를 갖는 BigDecimal로 만든다.
        BigDecimal value = src.setScale(scale, BigDecimal.ROUND_FLOOR);

        // 정수값
        int intValue = value.intValue();

        // 소수점이 필요없는 최소값을 구한다.
        // 예를 들어, 앞에서 4자리를 자른다면, 10000이 소수점이 필요없는 최소값이 되고 10000보다 작은 숫자는 
       // 무조건 소수점이 생기게 된다.
        int boundaryValue = (int) Math.pow(10, wantSize);
        // 자르려고하는 최소숫자보다 작으면 여기서 리턴.
        if (intValue < boundaryValue) {
            // 문자열이 아니라 숫자 타입을 리턴하고 싶으면 리턴타입을 BigDecimal로 바꾸고 value를 리턴.
            return value.toString();
        }

        // 정수값이 자르려고 한 숫자보다 크게 나오면, 예를 들면, 37037.034 -> 37037 > 10000
        final String s = String.valueOf(intValue);
        // 정수값의 길이만큼 '0'를 뒷쪽에 붙인다.  eg. 37037 -> 37030
        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;
    }
}

 

제코드는 겨우 동작하는 최적화된 코드가 아니니, 참고만 하시고 최적화하신 다음 사용하기를 강력 권장합니다. 아이디어만 가져가세요. 코드에 주석도 많이 달았고, 이제 남은 몫은 님의 것이니 제코드 관련해서는 더는 질문은 받지 않겠습니다.

spark (227,470 포인트) 님이 2020년 12월 4일 답변
...