2017年6月27日火曜日

Javaで文字列関連の自作ユーティリティ

(2017/06/27)
ApacheCommonsとGsonが必要なところがあります。

public class StringUtil {


    /**

    * パラメータを3桁カンマ区切り数字として返す。

    * @param number        処理対象文字列

    * @return                      フォーマット後文字列

    */

    public static String formatComma(String number) {

            if (!NumberUtils.isCreatable(number)) {

                    return number;

            }

            NumberFormat nfNum = NumberFormat.getNumberInstance();

            return nfNum.format(Double.parseDouble(number));

    }



    /**

    * パラメータの文字列を、パラメータの最大文字数で切って返す。

    *

    * nullの場合ブランクを返す。

    * 文字数以内の場合文字列をそのまま返す。

    * 指定文字数を超える場合は文字数で切った文字列を返す。

    *

    * @param target 処理対象文字列

    * @param length 文字数

    * @return 処理後文字列

    */

    public static String split(String target, int length) {

            String res = null;



            if (StringUtils.isEmpty(target)) {

                    res = "";

            } else if (target.length() > length) {

                    res = target.substring(0, length);

            } else {

                    res = target;

            }



            return res;

    }



    /**

    * 引数の文字列をSHA-256で暗号化して、16進数エンコードする。

    * ※base64でもエンコード出来るが、その場合、文字数が64文字以下になる。

    * @param pass

    * @return

    */

    public static String encode(String pass) {

            MessageDigest md = null;

            try {

                    md = MessageDigest.getInstance("SHA-256");

            } catch (NoSuchAlgorithmException e) {// 発生しない

                    e.printStackTrace();

            }

            md.update(pass.getBytes());

            byte[] digest = md.digest();



            // 16 進数文字列として出力

            StringBuilder sb = new StringBuilder();

            for(byte b : digest) {

                    String hex = String.format("%02x", b); // 16 進数 2 桁として表示 (1byte は 00 ~ ff)

                    sb.append(hex);

            }



            String result = sb.toString();



            if (result.length() > 64) {

                    result = result.substring(0, 64);

            }



            return result;

    }



    /**

    * ランダムな32文字の文字列を生成する。

    * CSRF攻撃対策用のトークンとして使用する。

    * @return

    */

    public static String getRandomToken() {

            SecureRandom random = new SecureRandom();

            byte bytes[] = new byte[32];

            random.nextBytes(bytes);



            // 16 進数文字列として出力

            StringBuilder sb = new StringBuilder();

            for(byte b : bytes) {

                    String hex = String.format("%02x", b); // 16 進数 2 桁として表示 (1byte は 00 ~ ff)

                    sb.append(hex);

            }



            String result = sb.toString();



            if (result.length() > 32) {

                    result = result.substring(0, 32);

            }

            return result;

    }



    /**

    * ランダムな文字列を生成する。

    * 文字列に記号を含めるため、base64でエンコードする。

    * パスワードを生成するために使用する。

    * @param num   文字数

    * @return      生成したパスワード

    */

    public static String getRandomPass(int num) {

            SecureRandom random = new SecureRandom();

            byte bytes[] = new byte[32];

            random.nextBytes(bytes);



            String encoded = Base64.getEncoder().encodeToString(bytes);



            String result =  "";

            if (num <= 32) {

                    result = encoded.substring(0, num);

            } else {

                    result = encoded.substring(0, 32);

            }

            return result;

    }



    /**

    * 数値を指定の桁で0埋めする

    * @param num   処理対象数値

    * @param digit 桁数

    * @return              0埋め後文字列

    */

    public static String padZero(int num, int digit) {

            return String.format("%0" + digit +"d", num);

    }



    /**

    * 指定の桁までスペース埋めする

    * @param str   処理対象文字列

    * @param digit 桁数

    * @return              スペース埋め後文字列

    */

    public static String padSpace(String str, int digit) {

            return String.format("%" + digit +"s", str);

    }



    /**

    * 数字の頭の0を除去する

    * @param str   処理対象文字列

    * @return              0除去後文字列

    */

    public static String ltrimZero(String str) {

            return str.replaceFirst("^0+", "");

    }



    /**

    * 文字列の頭のスペースを除去する

    * @param str   処理対象文字列

    * @return              スペース除去後文字列

    */

    public static String ltrim(String str) {

            return str.replaceFirst("^ +", "");

    }



    /**

    * 文字列の後ろのスペースを除去する

    * @param str   処理対象文字列

    * @return              スペース除去後文字列

    */

    public static String rtrim(String str) {

            return str.replaceFirst(" +$", "");

    }



    /**

    * JSON文字列からMapを生成

    * @param json  JSON文字列

    * @return              Map

    */

    public static Map<String, String> createMapFromJson(String json) {

            Gson gson = new Gson();

            Type listType = new TypeToken<HashMap<String, String>>() { }. getType();

    HashMap<String, String> map = gson.fromJson(json, listType);

    return map;

    }



    /**

    * MapからJSON文字列を生成

    * @param map   Map

    * @return              JSON文字列

    */

    public static String createJsonFromMap(Map<String, String> map) {

            Gson gson = new Gson();

            return gson.toJson(map);

    }



    /**

    * パラメータ1がnullの場合はパラメータ2を返す(SQLのNVLと同じ)

    * @param val1  検査対象文字列

    * @param val2  パラメータ1がnullの時に返す文字列

    * @return              判定後パラメータ1OR2

    */

    public static String nvl(String val1, String val2) {

            if (val1 == null) {

                    return val2;

            } else {

                    return val1;

            }

    }

}

0 件のコメント:

コメントを投稿