using System; using System.Collections.Generic; using System.Text; using System.Globalization; namespace HH.WMS.Utils.NPOI.SS.Util { /// /// A substitute class for Format class in Java /// public abstract class FormatBase { public FormatBase() { } public virtual string Format(Object obj) { return obj.ToString(); } public abstract StringBuilder Format(Object obj, StringBuilder toAppendTo); //public abstract Object Parse(string source); public abstract Object ParseObject(string source, int pos); } /** * Format class for Excel's SSN Format. This class mimics Excel's built-in * SSN Formatting. * * @author James May */ public class SSNFormat : FormatBase { public static FormatBase instance = new SSNFormat(); private static string df = "000000000"; private SSNFormat() { // enforce singleton } /** Format a number as an SSN */ public override String Format(object obj) { String result = ((double)obj).ToString(df, CultureInfo.InvariantCulture); StringBuilder sb = new StringBuilder(); sb.Append(result.Substring(0, 3)).Append('-'); sb.Append(result.Substring(3, 2)).Append('-'); sb.Append(result.Substring(5, 4)); return sb.ToString(); } public override StringBuilder Format(Object obj,StringBuilder toAppendTo) { return toAppendTo.Append(Format((long)obj)); } public override Object ParseObject(String source, int pos) { string tmp = source.Substring(pos); return long.Parse(tmp, CultureInfo.InvariantCulture); } } /** * Format class for Excel Zip + 4 Format. This class mimics Excel's * built-in Formatting for Zip + 4. * @author James May */ public class ZipPlusFourFormat : FormatBase { public static FormatBase instance = new ZipPlusFourFormat(); private static string df = "000000000"; private ZipPlusFourFormat() { // enforce singleton } /** Format a number as Zip + 4 */ public override String Format(object obj) { String result = ((double)obj).ToString(df, CultureInfo.InvariantCulture); StringBuilder sb = new StringBuilder(); sb.Append(result.Substring(0, 5)).Append('-'); sb.Append(result.Substring(5, 4)); return sb.ToString(); } public override StringBuilder Format(Object obj, StringBuilder toAppendTo) { return toAppendTo.Append(Format(obj)); } public override Object ParseObject(String source, int pos) { string tmp = source.Substring(pos); return long.Parse(tmp, CultureInfo.InvariantCulture); } } /** * Format class for Excel phone number Format. This class mimics Excel's * built-in phone number Formatting. * @author James May */ public class PhoneFormat : FormatBase { public static FormatBase instance = new PhoneFormat(); private static string df = "##########"; private PhoneFormat() { // enforce singleton } /** Format a number as a phone number */ public override String Format(object obj) { String result = ((double)obj).ToString(df, CultureInfo.InvariantCulture); StringBuilder sb = new StringBuilder(); String seg1, seg2, seg3; int len = result.Length; if (len <= 4) { return result; } seg3 = result.Substring(len - 4); int beginpos = Math.Max(0, len - 7); seg2 = result.Substring(Math.Max(0, len - 7), len - 4 - beginpos); beginpos = Math.Max(0, len - 10); seg1 = result.Substring(beginpos, Math.Max(0, len - 7) - beginpos); if (seg1 != null && seg1.Trim().Length > 0) { sb.Append('(').Append(seg1).Append(") "); } if (seg2 != null && seg2.Trim().Length > 0) { sb.Append(seg2).Append('-'); } sb.Append(seg3); return sb.ToString(); } public override StringBuilder Format(Object obj, StringBuilder toAppendTo) { return toAppendTo.Append(Format(obj)); } public override Object ParseObject(String source, int pos) { string tmp = source.Substring(pos); return long.Parse(tmp, CultureInfo.InvariantCulture); } } public class DecimalFormat : FormatBase { public DecimalFormat() { } private string pattern; public DecimalFormat(string pattern) { if (pattern.IndexOf("'", StringComparison.Ordinal) != -1) throw new ArgumentException("invalid pattern"); this.pattern = pattern; } public string Pattern { get { return pattern; } } public override string Format(object obj) { if (pattern.IndexOf("'", StringComparison.Ordinal) != -1) { //return ((double)obj).ToString(); return Convert.ToDouble(obj, CultureInfo.InvariantCulture).ToString(CultureInfo.CurrentCulture); } else { return Convert.ToDouble(obj, CultureInfo.InvariantCulture).ToString(pattern, CultureInfo.CurrentCulture); //return ((double)obj).ToString(pattern) ; } } public override StringBuilder Format(object obj, StringBuilder toAppendTo) { return toAppendTo.Append(Format((double)obj)); } public override object ParseObject(string source, int pos) { return System.Decimal.Parse(source.Substring(pos), CultureInfo.CurrentCulture); } private bool _parseIntegerOnly =false; public bool ParseIntegerOnly { get{return _parseIntegerOnly;} set{_parseIntegerOnly =value;} } } public class SimpleDateFormat : FormatBase { public SimpleDateFormat() { } protected string pattern; public SimpleDateFormat(string pattern) { this.pattern = pattern; } public override string Format(object obj) { String result = ((DateTime)obj).ToString(pattern, DateTimeFormatInfo.InvariantInfo); return result; } public override StringBuilder Format(object obj, StringBuilder toAppendTo) { return toAppendTo.Append(this.Format((DateTime)obj)); } public override object ParseObject(string source, int pos) { return DateTime.Parse(source.Substring(pos), CultureInfo.InvariantCulture).ToUniversalTime(); } } /** * Format class that does nothing and always returns a constant string. * * This format is used to simulate Excel's handling of a format string * of all # when the value is 0. Excel will output "", Java will output "0". * * @see DataFormatter#createFormat(double, int, String) */ public class ConstantStringFormat : FormatBase { private static DecimalFormat df = new DecimalFormat("##########"); private String str; public ConstantStringFormat(String s) { str = s; } public override string Format(object obj) { return str; } public override StringBuilder Format(Object obj, StringBuilder toAppendTo) { return toAppendTo.Append(str); } public override Object ParseObject(String source, int pos) { return df.ParseObject(source, pos); } } }