using System;
using System.Globalization;
using System.Text;
namespace Houdar.Core.Util.Common
{
///
/// 一些转换功能
///
public class DefaultConvert
{
///
/// obj对象转int
///
/// 转换对象
/// 缺省值
///
public virtual int ToInt(object value, int defaultValue)
{
if (value == null) return defaultValue;
var s = value as string;
if (s != null)
{
var str = s;
str = ToDbc(str).Trim();
if (string.IsNullOrEmpty(str)) return defaultValue;
int n;
if (int.TryParse(str, out n)) return n;
return defaultValue;
}
var bytes = value as byte[];
if (bytes != null)
{
var buf = bytes;
if (buf.Length < 1) return defaultValue;
switch (buf.Length)
{
case 1:
return buf[0];
case 2:
return BitConverter.ToInt16(buf, 0);
case 3:
return BitConverter.ToInt32(new byte[] {buf[0], buf[1], buf[2], 0}, 0);
case 4:
return BitConverter.ToInt32(buf, 0);
}
}
try
{
return Convert.ToInt32(value);
}
catch
{
return defaultValue;
}
}
///
/// obj对象转double
///
/// 转换对象
/// 缺省值
///
public virtual double ToDouble(object value, double defaultValue)
{
if (value == null) return defaultValue;
// 特殊处理字符串,也是最常见的
var s = value as string;
if (s != null)
{
var str = s;
str = ToDbc(str).Trim();
if (string.IsNullOrEmpty(str)) return defaultValue;
double n;
if (double.TryParse(str, out n)) return n;
return defaultValue;
}
var bytes = value as byte[];
if (bytes != null)
{
var buf = bytes;
if (buf.Length < 1) return defaultValue;
switch (buf.Length)
{
case 1:
return buf[0];
case 2:
return BitConverter.ToInt16(buf, 0);
case 3:
return BitConverter.ToInt32(new byte[] {buf[0], buf[1], buf[2], 0}, 0);
case 4:
return BitConverter.ToInt32(buf, 0);
default:
// 凑够8字节
if (buf.Length < 8)
{
var bts = new byte[8];
Buffer.BlockCopy(buf, 0, bts, 0, buf.Length);
buf = bts;
}
return BitConverter.ToDouble(buf, 0);
}
}
try
{
return Convert.ToDouble(value);
}
catch
{
return defaultValue;
}
}
///
/// obj对象转bool
///
/// 转换对象
/// 缺省值
///
public virtual bool ToBoolean(object value, bool defaultValue)
{
if (value == null) return defaultValue;
// 特殊处理字符串,也是最常见的
var s = value as string;
if (s != null)
{
var str = s;
str = ToDbc(str).Trim();
if (string.IsNullOrEmpty(str)) return defaultValue;
bool b;
if (bool.TryParse(str, out b)) return b;
if (string.Equals(str, bool.TrueString, StringComparison.OrdinalIgnoreCase)) return true;
if (string.Equals(str, bool.FalseString, StringComparison.OrdinalIgnoreCase)) return false;
// 特殊处理用数字0和1表示布尔型
int n;
if (int.TryParse(str, out n)) return n > 0;
return defaultValue;
}
try
{
return Convert.ToBoolean(value);
}
catch
{
return defaultValue;
}
}
///
/// obj对象转DateTime
///
/// 转换对象
/// 缺省值
///
public virtual DateTime ToDateTime(object value, DateTime defaultValue)
{
if (value == null) return defaultValue;
// 特殊处理字符串,也是最常见的
var s = value as string;
if (s != null)
{
var str = s;
str = ToDbc(str).Trim();
if (string.IsNullOrEmpty(str)) return defaultValue;
DateTime n;
if (DateTime.TryParse(str, out n)) return n;
if (str.Contains("-") && DateTime.TryParseExact(str, "yyyy-M-d", null, DateTimeStyles.None, out n))
return n;
if (str.Contains("/") && DateTime.TryParseExact(str, "yyyy/M/d", null, DateTimeStyles.None, out n))
return n;
if (DateTime.TryParse(str, out n)) return n;
return defaultValue;
}
try
{
return Convert.ToDateTime(value);
}
catch
{
return defaultValue;
}
}
private static string ToDbc(string str)
{
var ch = str.ToCharArray();
for (var i = 0; i < ch.Length; i++)
{
// 全角空格
if (ch[i] == 0x3000)
ch[i] = (char) 0x20;
else if (ch[i] > 0xFF00 && ch[i] < 0xFF5F)
ch[i] = (char) (ch[i] - 0xFEE0);
}
return new string(ch);
}
///
/// obj对象转DateTime
///
/// 转换对象
/// 缺省值
///
public virtual string ToFullString(DateTime value, string emptyValue = null)
{
if (emptyValue != null && value <= DateTime.MinValue) return emptyValue;
//return value.ToString("yyyy-MM-dd HH:mm:ss");
var dt = value;
var sb = new StringBuilder();
sb.Append(dt.Year.ToString().PadLeft(4, '0'));
sb.Append("-");
sb.Append(dt.Month.ToString().PadLeft(2, '0'));
sb.Append("-");
sb.Append(dt.Day.ToString().PadLeft(2, '0'));
sb.Append(" ");
sb.Append(dt.Hour.ToString().PadLeft(2, '0'));
sb.Append(":");
sb.Append(dt.Minute.ToString().PadLeft(2, '0'));
sb.Append(":");
sb.Append(dt.Second.ToString().PadLeft(2, '0'));
return sb.ToString();
}
///
/// obj对象转DateTime
///
/// 转换对象
/// 转换格式
/// 缺省值
///
public virtual string ToString(DateTime value, string format, string emptyValue)
{
if (emptyValue != null && value <= DateTime.MinValue) return emptyValue;
if (format == null || format == "yyyy-MM-dd HH:mm:ss") return ToFullString(value, emptyValue);
return value.ToString(format);
}
}
}