package peergos.shared.util; public class StringUtils { public static String format(String format, Object ... args) { return sprintf(format, args); } //from jDosbox public static String sprintf(String format, Object[] args) { int pos = format.indexOf('%'); if (pos>=0) { StringBuffer buffer = new StringBuffer(); int argIndex = 0; while (pos>=0) { buffer.append(format.substring(0, pos)); if (pos+1<format.length()) { char c = format.charAt(++pos); if (c == '%') { buffer.append("%"); format = format.substring(2); } else { boolean leftJustify = false; boolean showPlus = false; boolean spaceSign = false; boolean prefix = false; boolean leftPadZero = false; int width = 0; int precision = -1; // flags while (true) { if (c=='-') { leftJustify = true; } else if (c=='+') { showPlus = true; } else if (c==' ') { spaceSign = true; } else if (c=='#') { prefix = true; } else if (c=='0') { leftPadZero = true; } else { break; } if (pos+1<format.length()) { c = format.charAt(++pos); } else { return buffer.toString(); } } // width String w = ""; while (true) { if (c>='0' && c<='9') { w+=c; } else { break; } if (pos+1<format.length()) { c = format.charAt(++pos); } else { return buffer.toString(); } } if (w.length()>0) { width = Integer.parseInt(w); } // precision if (c=='.') { if (pos+1<format.length()) { c = format.charAt(++pos); } else { return buffer.toString(); } String p = ""; while (true) { if (c>='0' && c<='9') { p+=c; } else { break; } if (pos+1<format.length()) { c = format.charAt(++pos); } else { return buffer.toString(); } } if (p.length()>0) { precision = Integer.parseInt(p); } } // length if (c=='h') { if (pos+1<format.length()) { c = format.charAt(++pos); } else { return buffer.toString(); } } else if (c=='l') { if (pos+1<format.length()) { c = format.charAt(++pos); } else { return buffer.toString(); } } else if (c=='L') { if (pos+1<format.length()) { c = format.charAt(++pos); } else { return buffer.toString(); } } String value = ""; String strPrfix = ""; boolean negnumber = false; if (c == 'c') { if (args[argIndex] instanceof Character) { value = String.valueOf(args[argIndex]); } else if (args[argIndex] instanceof String) { value = (String)args[argIndex]; } else { System.out.println("Invalid printf argument type for %c: "+args[argIndex].getClass()); return buffer.toString(); } if (value.length()>1) value = value.substring(0,1); } else if (c == 's') { if (args[argIndex] instanceof Character) { value = String.valueOf(args[argIndex]); } else if (args[argIndex] instanceof String) { value = (String)args[argIndex]; } else { System.out.println("Invalid printf argument type for %s: "+args[argIndex].getClass()); return buffer.toString(); } if (precision>0 && value.length()>precision) { value = value.substring(0,precision); } } else if (c == 'x') { if (args[argIndex] instanceof Integer) { value = Integer.toString(((Integer)args[argIndex]).intValue(), 16); } else if (args[argIndex] instanceof Long) { value = Long.toString(((Long)args[argIndex]).longValue(), 16); } else { System.out.println("Invalid printf argument type for %x: "+args[argIndex].getClass()); return buffer.toString(); } negnumber = value.startsWith("-"); if (negnumber) value = value.substring(1); if (precision==0 && value.equals("0")) { format = format.substring(pos); continue; } if (prefix) { strPrfix += "0x"+value; } } else if (c == 'X') { if (args[argIndex] instanceof Integer) { value = Integer.toString(((Integer)args[argIndex]).intValue(), 16); } else if (args[argIndex] instanceof Long) { value = Long.toString(((Long)args[argIndex]).longValue(), 16); } else { System.out.println("Invalid printf argument type for %X: "+args[argIndex].getClass()); return buffer.toString(); } negnumber = value.startsWith("-"); if (negnumber) value = value.substring(1); if (precision==0 && value.equals("0")) { format = format.substring(pos); continue; } if (precision>0) { while (value.length()<precision) { value = "0"+value; } } value = value.toUpperCase(); if (prefix) { strPrfix += "0X"+value; } } else if (c == 'd') { if (args[argIndex] instanceof Integer) { value = Integer.toString(((Integer)args[argIndex]).intValue()); } else if (args[argIndex] instanceof Long) { value = String.valueOf(((Long)args[argIndex]).longValue()); } else { System.out.println("Invalid printf argument type for %d: "+args[argIndex].getClass()); return buffer.toString(); } negnumber = value.startsWith("-"); if (negnumber) value = value.substring(1); if (precision==0 && value.equals("0")) { format = format.substring(pos); continue; } if (precision>0) { while (value.length()<precision) { value = "0"+value; } } } else if (c == 'f') { if (args[argIndex] instanceof Double) { value = String.valueOf(((Double)args[argIndex]).doubleValue()); } else if (args[argIndex] instanceof Float) { value = String.valueOf(((Float)args[argIndex]).doubleValue()); } else { System.out.println("Invalid printf argument type for %f: "+args[argIndex].getClass()); return buffer.toString(); } negnumber = value.startsWith("-"); if (negnumber) value = value.substring(1); int dec = value.indexOf('.'); if (dec>=0) { if (precision==0) { value = value.substring(0, dec); } else if (value.length()>dec+1+precision) { value = value.substring(0, dec+1+precision); } } } if (negnumber) { strPrfix = "-"; } else { if (showPlus) { strPrfix = "+"+strPrfix; } else if (spaceSign) { strPrfix = " "+strPrfix; } } while (width>strPrfix.length()+value.length()) { if (leftPadZero) { strPrfix+="0"; } else if (leftJustify) { value=value+" "; } else { strPrfix=" "+strPrfix; } } buffer.append(strPrfix); buffer.append(value); format = format.substring(++pos); } } argIndex++; pos = format.indexOf('%'); } buffer.append(format); return buffer.toString(); } else { return format; } } }