이 글은 안드로이드에서 자주 사용되는 코드이지만, 자주 잊어버리는 류의 코드에 관한 것입니다.

 

문제는 "오늘은 OO를 XX개 먹었습니다."를 표현하는 것입니다. 예전에 안드로이드를 잘 모를 때 해결했던 방법은 아래와 같습니다.

<string name="eat">오늘은 사과를 %d 개 먹었습니다.</string>
val count = 5
var text = String.format(getString(R.string.eat), count)

 

그런데, 알고 봤더니 이미 이런 것들에 관한 것은 개발자 페이지에 아주 상세히 설명되어 있었습니다.

getString() API 에 이미 이런 상황에 대해 대비가 되어있었던 것입니다.

그것도 이미 API level 1 에서 말이죠.

(developer.android.com/guide/topics/resources/string-resource?hl=ko#%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%84%9C%EC%8B%9D-%EC%A7%80%EC%A0%95)

<string name="welcome_messages">Hello, %1$s! You have %2$d new messages.</string>
var text = getString(R.string.welcome_messages, username, mailCount)

 

안드로이드 개발자 사이트 링크

developer.android.com/reference/android/content/Context?hl=ko#getString(int,%20java.lang.Object...)

getString(int resId, Object... formatArgs)Returns a localized formatted string from the application's package's default string table, substituting the format arguments as defined in Formatter and String.format(String, Object...).

 

안드로이드 Resources.java 소스 코드

    @NonNull
    public String getString(@StringRes int id, Object... formatArgs) throws NotFoundException {
        final String raw = getString(id);
        return String.format(mResourcesImpl.getConfiguration().getLocales().get(0), raw,
                formatArgs);
    }

 

즉, String.format 으로 어렵게 코딩하지 않고, getString() 에 인자만 더 추가해 주면 됩니다.

 

 

기왕 글을 쓴 김에 노파심에 몇 가지 더 추가하면, 크게 두 가지 입니다.

첫째, 입력 값이 여러 개인 경우, 둘째, 입력 값이 복수일 경우입니다.

물론, 우리 나라에서만 사용한다면, 이 두 가지 모두 큰 의미는 없습니다.

 

1. 위에서 %1, %2 와 같은 표현들이 있는데, 이것은 입력 값의 순서를 의미합니다.

간혹, 언어를 번역하다보면, 입력 값들의 순서가 아래 코드처럼 바뀌는 경우가 있기 때문입니다.

<string name="eat">나는 %1$s를 %2$d개 먹었습니다.</string>
<!-- 나는 사과를 2개 먹었습니다. -->
<string name="eat">I ate %2$d %1$s</string>
<!-- I ate 2 apples -->

 

2. 위의 경우 처럼 복수가 될 경우, apple -> apples 로 사용해야할 수도 있습니다.

물론, 개발자 사이트에 상세히 설명되어 있지만,(https://developer.android.com/guide/topics/resources/string-resource?hl=ko#Plurals)

간단히 부연 설명을 하면, 이럴 때에는 별도로 getQuantityString() 와 plurals.xml 을 사용해야 합니다.

<resources>
    <plurals name="numberOfSongsAvailable">
        <item quantity="one">%d song found.</item>
        <item quantity="other">%d songs found.</item>
    </plurals>
</resources>
val count = getNumberOfSongsAvailable()
val songsFound = resources.getQuantityString(R.plurals.numberOfSongsAvailable, count, count)

 

 

잡담.  길다고 하면 긴 시간동안 코딩을 해왔지만, plurals.xml 을 적용한 경우는 거의 본 적이 없습니다. ㅋ

그래도 알아두면 언젠가 쓰는 날이 오겠지요. ㅋ