package sample.util; import java.math.BigDecimal; import java.util.Optional; import com.ibm.icu.text.Transliterator; /** 各種型/文字列変換をサポートします。(ICU4Jライブラリに依存しています) */ public abstract class ConvertUtils { private static Transliterator ZenkakuToHan = Transliterator.getInstance("Fullwidth-Halfwidth"); private static Transliterator HankakuToZen = Transliterator.getInstance("Halfwidth-Fullwidth"); private static Transliterator KatakanaToHira = Transliterator.getInstance("Katakana-Hiragana"); private static Transliterator HiraganaToKana = Transliterator.getInstance("Hiragana-Katakana"); /** 例外無しにLongへ変換します。(変換できない時はnull) */ public static Long quietlyLong(Object value) { try { return Optional.ofNullable(value).map(v -> Long.parseLong(v.toString())).orElse(null); } catch (NumberFormatException e) { return null; } } /** 例外無しにIntegerへ変換します。(変換できない時はnull) */ public static Integer quietlyInt(Object value) { try { return Optional.ofNullable(value).map(v -> Integer.parseInt(v.toString())).orElse(null); } catch (NumberFormatException e) { return null; } } /** 例外無しにBigDecimalへ変換します。(変換できない時はnull) */ public static BigDecimal quietlyDecimal(Object value) { try { return Optional.ofNullable(value).map((v) -> new BigDecimal(v.toString())).orElse(null); } catch (NumberFormatException e) { return null; } } /** 例外無しBooleanへ変換します。(変換できない時はfalse) */ public static Boolean quietlyBool(Object value) { return Optional.ofNullable(value).map((v) -> Boolean.parseBoolean(v.toString())).orElse(false); } /** 全角文字を半角にします。 */ public static String zenkakuToHan(String text) { return Optional.ofNullable(text).map((v) -> ZenkakuToHan.transliterate(v)).orElse(null); } /** 半角文字を全角にします。 */ public static String hankakuToZen(String text) { return Optional.ofNullable(text).map((v) -> HankakuToZen.transliterate(v)).orElse(null); } /** カタカナをひらがなにします。 */ public static String katakanaToHira(String text) { return Optional.ofNullable(text).map((v) -> KatakanaToHira.transliterate(v)).orElse(null); } /** * ひらがな/半角カタカナを全角カタカナにします。 * <p>low: 実際の挙動は厳密ではないので単体検証(ConvertUtilsTest)などで事前に確認して下さい。 */ public static String hiraganaToZenKana(String text) { return Optional.ofNullable(text).map((v) -> HiraganaToKana.transliterate(v)).orElse(null); } /** * ひらがな/全角カタカナを半角カタカナにします。 * <p>low: 実際の挙動は厳密ではないので単体検証(ConvertUtilsTest)などで事前に確認して下さい。 */ public static String hiraganaToHanKana(String text) { return zenkakuToHan(hiraganaToZenKana(text)); } /** 指定した文字列を抽出します。(サロゲートペア対応) */ public static String substring(String text, int start, int end) { if (text == null) return null; int spos = text.offsetByCodePoints(0, start); int epos = text.length() < end ? text.length() : end; return text.substring(spos, text.offsetByCodePoints(spos, epos - start)); } /** 文字列を左から指定の文字数で取得します。(サロゲートペア対応) */ public static String left(String text, int len) { return substring(text, 0, len); } /** 文字列を左から指定のバイト数で取得します。 */ public static String leftStrict(String text, int lenByte, String charset) { StringBuilder sb = new StringBuilder(); try { int cnt = 0; for (int i = 0; i < text.length(); i++) { String v = text.substring(i, i + 1); byte[] b = v.getBytes(charset); if (lenByte < cnt + b.length) { break; } else { sb.append(v); cnt += b.length; } } } catch (Exception e) { throw new IllegalArgumentException(e); } return sb.toString(); } }