/* * Copyright 1999-2012 Alibaba Group. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.alibaba.cobar.manager.util; import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.Date; /** * ????????? * * @author xianmao.hexm * @version 2008-11-24 ????12:58:17 */ public class FormatUtil { // ???????????? public static final int ALIGN_RIGHT = 0; // ???????????? public static final int ALIGN_LEFT = 1; private static final char defaultSplitChar = ' '; private static final String[] timeFormat = new String[] { "d ", "h ", "m ", "s ", "ms" }; private static final DecimalFormat numberFormat = new DecimalFormat("###,###"); private static final long KB = 1024L; private static final long MB = 1024L * 1024; private static final long GB = 1024L * 1024 * 1024; private static final long TB = 1024L * 1024 * 1024 * 1024; /** * ???????????? * * @param s ???????????????????????? * @param fillLength ????? * @return String */ public static final String format(String s, int fillLength) { return format(s, fillLength, defaultSplitChar, ALIGN_LEFT); } /** * ???????????? * * @param i ???????????????????????????? * @param fillLength ????? * @return String */ public static final String format(int i, int fillLength) { return format(Integer.toString(i), fillLength, defaultSplitChar, ALIGN_RIGHT); } /** * ???????????? * * @param l ???????????????????????????? * @param fillLength ????? * @return String */ public static final String format(long l, int fillLength) { return format(Long.toString(l), fillLength, defaultSplitChar, ALIGN_RIGHT); } /** * @param s ??????????????? * @param fillLength ????? * @param fillChar ??????? * @param align ???????????��???????? * @return String */ public static final String format(String s, int fillLength, char fillChar, int align) { if (s == null) { s = ""; } else { s = s.trim(); } int charLen = fillLength - s.length(); if (charLen > 0) { char[] fills = new char[charLen]; for (int i = 0; i < charLen; i++) { fills[i] = fillChar; } StringBuilder str = new StringBuilder(s); switch (align) { case ALIGN_RIGHT: str.insert(0, fills); break; case ALIGN_LEFT: str.append(fills); break; default: str.append(fills); } return str.toString(); } else { return s; } } /** * ??????????? * <p> * 1d 15h 4m 15s 987ms * </p> */ public static final String formatTime(long millis, int precision) { long[] la = new long[5]; la[0] = (millis / 86400000);// days la[1] = (millis / 3600000) % 24;// hours la[2] = (millis / 60000) % 60;// minutes la[3] = (millis / 1000) % 60;// seconds la[4] = (millis % 1000);// ms int index = 0; for (int i = 0; i < la.length; i++) { if (la[i] != 0) { index = i; break; } } StringBuilder buf = new StringBuilder(); int validLength = la.length - index; for (int i = 0; (i < validLength && i < precision); i++) { buf.append(la[index]).append(timeFormat[index]); index++; } return buf.toString(); } /** * ?????????????? * * @param millis * @return // 1293690711302L -> 2010-12-30 14:31:51 */ public static final String fromMilliseconds2String(long millis) { Date date = new Date(millis); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return format.format(date); } /** * ??????????????offer??...?? * * @param source ??? * @param length ?????????? * @return */ public static final String shortString(String source, int length) { if (source.length() > length) { int endIndex = length - 1; String result = source.substring(0, endIndex) + "..."; return result; } return source; } /** * ??jdbc?��??????cobar??��?? * * @param src * @return 5.1.00-cobar-1.1.0 -> cobar-1.1.0 */ public static final String formatVersion(String src) { if (src != null) { int index = src.indexOf('-'); if (index != -1) return src.substring(index + 1); } return src; } /** * ????��??????????????????��????????��??? * * @param store * @return 2048 -> 2KB , 123 -> 123B */ public static String formatStore(long store) { if (store > TB) { double mem = divider(store, TB, 2); return new StringBuilder(String.valueOf(mem)).append(" ").append("TB").toString(); } else if (store > GB) { double mem = divider(store, GB, 2); return new StringBuilder(String.valueOf(mem)).append(" ").append("GB").toString(); } else if (store > MB) { double mem = divider(store, MB, 2); return new StringBuilder(String.valueOf(mem)).append(" ").append("MB").toString(); } else if (store > KB) { double mem = divider(store, KB, 2); return new StringBuilder(String.valueOf(mem)).append(" ").append("KB").toString(); } else { return new StringBuilder(String.valueOf(store)).append(" ").append("B").toString(); } } /** * ????????? * @param d1 ?????? * @param d2 ???? * @param scale ????(��??��??) * @return d1/d2, if(d2==0),return 0; */ public static double divider(double d1, double d2, int scale) { if (d2 == 0) { return 0; } BigDecimal bd1 = new BigDecimal(Double.toString(d1)); BigDecimal bd2 = new BigDecimal(Double.toString(d2)); return bd1.divide(bd2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** * ???????????????��??? * * @param network * @return 2048 -> 2KB/s */ public static String formatNetwork(long network) { StringBuilder sb = new StringBuilder(formatStore(network)); return sb.append("/s").toString(); } /** * ?????????��????? * * @param number * @return 123456 -> 123,456 */ public static String formatNumber(long number) { return numberFormat.format(number); } }