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と以下の書籍を参考にしている。
問題自体は第2版のもの。
自分で考えるために他言語の例をGroovyで置き換えてる。
が、自分だけで書いてるとGroovyっぽくならいないのが玉にキズ。