package org.itscool.commons.util;

/**
 * 各種数値型データと文字列との相互変換を行うクラスです
 * @author kanou
 *
 */
public class NumberFormatUtil {
    
    /**
     * 1000といった文字列から\1,000に変換します
     * @param numStr 数値文字列
     * @return 金額に換算した文字列を返します
     */
    public static String encodeMoneyString(String numStr){
        if (numStr == null || numStr.toString().length() == 0 ) {
            return numStr;
        }
        
        try{
            //小数点位置を取得
            int pointIndex = numStr.indexOf(".");
            String bodyStr = "";
            String pointStr = "";
            //小数点以下を別の変数に退避
            if( pointIndex != -1 ){
                pointStr = numStr.substring(pointIndex+1, numStr.length());
                bodyStr = numStr.substring(0, pointIndex);
            }else{
                bodyStr = numStr;
            }
            Integer.parseInt(bodyStr);
            if( bodyStr.length() <= 3){
                return "\\" + numStr;
            }
            //for(int i=0; i<bodyStr.length(); i+=4){
            int bodyLen = bodyStr.length();
            String newStr=bodyStr.substring(bodyLen-3, bodyLen);
            bodyStr = bodyStr.substring(0, bodyLen-3);
            bodyLen = bodyStr.length();
            while(bodyLen > 4){
                bodyLen = bodyStr.length();
                String next = bodyStr.substring(bodyLen-3, bodyLen);
                bodyStr = bodyStr.substring(0, bodyLen-3);
                newStr = next + "," + newStr;
            }
            if( bodyStr.length() > 0){
                newStr = bodyStr + "," + newStr;
            }
            if(pointStr!=null && pointStr.length() > 0){
                newStr = newStr + "." + pointStr;
            }
            return "\\" + newStr;
        }catch(NumberFormatException e){
            return numStr;
        }
    }
    
    /**
     * \1,000といった文字列から1000に変換します
     * @param enNumStr 数値文字列
     * @return 金額に換算した文字列を返します
     */
    public static String decodeMoneyString(String enNumStr){
        if( enNumStr == null || enNumStr.length() == 0){
            return enNumStr;
        }
        if(enNumStr.substring(0,1).equals("\\")){
            enNumStr = enNumStr.substring(1, enNumStr.length());
            enNumStr = enNumStr.replaceAll(",", "");
        }
        return enNumStr;
    }
    
    /**
     * 指定された文字列が数値に変換可能か判定する
     * @param str 判定文字列
     * @return 判定文字列が数値変換可能な場合はtrueを返します
     */
    public static boolean isNumber(String str){
        try{
            Long.parseLong(str);
            return true;
        }catch(NumberFormatException nfe ){
        }
        try{
            Double.parseDouble(str);
            return true;
        }catch(NumberFormatException nfe ){
        }
        
        return false;
    }
    
    /**
     * 指定した値に指定した桁数分０パディングを行う。<BR>
     * 結果は文字列で返す
     * @param num 数値
     * @param keta 0パディングを行う桁
     * @return 0パディング後の文字列
     */
    public static String convZeroPadding(int num, int keta){
        String numStr = String.valueOf(num);
        int numLen = numStr.length();
        if( numLen >= keta){
            return numStr;
        }
        for(int i=0; i<(keta-numLen); i++){
            numStr = "0"+numStr;
        }
        return numStr;
    }
}
