067:文字列を最大n桁に切り詰める(ICU版)

東アジアの文字幅/East Asian Width というものが定められていて、
JavaだとEclipseでICU4Jを使うと判別できるらしい。

お題

文字列を最大n桁に切り詰める

コード

@Grab('com.ibm.icu:icu4j:50.1')
import com.ibm.icu.lang.UCharacter
import com.ibm.icu.lang.UProperty


def getWidth(int codePoint) {
    int value = UCharacter.getIntPropertyValue(codePoint, UProperty.EAST_ASIAN_WIDTH)
    switch(value) {
        case UCharacter.EastAsianWidth.NARROW:
        case UCharacter.EastAsianWidth.NEUTRAL:
        case UCharacter.EastAsianWidth.HALFWIDTH:
            return 1;
        case UCharacter.EastAsianWidth.FULLWIDTH:
        case UCharacter.EastAsianWidth.WIDE:
            return 2;
        case UCharacter.EastAsianWidth.AMBIGUOUS:
            return (["ja", "vi", "kr", "zh"].contains(Locale.getDefault().getLanguage())) ? 2 : 1
        default:
            return 1;
    }
}


def takeNcols(str, n) {
    result = ""
    length = 0
    for ( c in str) {
        length += getWidth((int)c)
        if ( length > n ) {
            break
        }
        result +=c
    }
    return result


}
assert takeNcols("あいうえおabcdeかきくけこfghij", 10) == "あいうえお"
assert takeNcols("1カナ亜、α()㌁■Aa=()ال", 10) == "1カナ亜、α"

添削歓迎

ここ間違ってるよ
こうした方がGroovyらしくないか?
などなど
方法は、コメント、トラックバックはてブTwitter @orange_clover宛 で、お願いします。

実行環境




Groovyの詳細についてはJavadocと以下の書籍を参考にしている。




関谷 和愛、上原 潤二、須江 信洋、中野 靖治
価格: ¥ 3,360
価格は記載時点のものです。購入前にAmazonでご確認ください。

「プログラミングGROOVY」正誤表




問題自体は第2版のもの。
自分で考えるために他言語の例をGroovyで置き換えてる。
が、自分だけで書いてるとGroovyっぽくならいないのが玉にキズ。




青木 峰郎、後藤 裕蔵、高橋 征義、まつもと ゆきひろ

価格: ¥ 2,940
価格は記載時点のものです。購入前にAmazonでご確認ください。