/// <summary> /// 组合后缀生成唯一ID /// </summary> /// <param name="uctTimeNow">时间</param> /// <param name="suffix">后缀只能是由26个字母加数字组成</param> /// <param name="fixLen">固定长度</param> /// <returns></returns> public static string MakeTradeNo(DateTime UctTimeNow, string suffix, int fixLen) { Thread.Sleep(1); if (fixLen < 17) { fixLen = 17; } string text = UctTimeNow.ToString("yyMMddHHmmssfffff"); string str = string.Empty; if (!string.IsNullOrEmpty(suffix)) { suffix = RegExMatch.RegexReplace(suffix, "[^A-Za-z0-9]+", "", true); try { str = AnyRadixConvert.AryConvert(suffix, 36, 10); } catch { str = string.Empty; } } text += str; int length = text.Length; if (length > fixLen) //大于指定的长度 { return(text.Substring(0, fixLen)); } else if (length < fixLen) //小于指定的长度 { text = string.Format("{0}{1}", text, AnyRadixConvert.GetRandomNum(fixLen - length)); } return(text); }
/// <summary> /// 将指定基数的数字的 System.String 表示形式转换为等效的 64 位有符号整数。 /// </summary> /// <param name="value">包含数字的 System.String。</param> /// <param name="fromBase">value 中数字的基数,它必须是[2,36]</param> /// <returns>等效于 value 中的数字的 64 位有符号整数。- 或 - 如果 value 为 null,则为零。</returns> private static long StringToLong(string value, int fromBase) { value = value != null?value.Trim() : null; if (string.IsNullOrEmpty(value)) { return(0L); } string text = new string(m_rDigits, 0, fromBase); long num = 0L; value = value.ToUpper(); for (int i = 0; i < value.Length; i++) { if (!text.Contains(value[i].ToString())) { throw new ArgumentException(string.Format("The argument \"{0}\" is not in {1} system.", value[i], fromBase)); } try { num += (long)Math.Pow((double)fromBase, (double)i) * (long)AnyRadixConvert.GetCharIndex(AnyRadixConvert.m_rDigits, value[value.Length - i - 1]); } catch { throw new OverflowException("运算溢出."); } } return(num); }
/// <summary> /// 生成基础资料ID /// </summary> /// <param name="uctTimeNow">时间</param> /// <param name="suffix">后缀只能是由26个字母加数字组成</param> /// <param name="fixLen">固定长度</param> /// <returns></returns> public static string MakeBaseDataId(DateTime uctTimeNow, string suffix, int fixLen) { Thread.Sleep(1); string text = string.Format("{0}{1}", uctTimeNow.Ticks.ToString(), suffix); int length = text.Length; if (length > fixLen) //大于指定的长度 { text = text.Substring(0, fixLen); } else if (length < fixLen) //小于指定的长度 { text = string.Format("{0}{1}", text, AnyRadixConvert.GetRandomNum(fixLen - length)); } return(text); }
/// <summary> /// 任意进制转换,将fromBase进制表示的value转换为toBase进制 /// </summary> /// <param name="value"></param> /// <param name="fromBase">原来进制(2-36进制)</param> /// <param name="toBase">转换后的进制(2-36进制)</param> /// <returns></returns> public static string AryConvert(string value, int fromBase, int toBase) { if (string.IsNullOrEmpty(value.Trim())) { return(string.Empty); } if (fromBase < 2 || fromBase > 36) { throw new ArgumentException(string.Format("The fromBase radix \"{0}\" is not in the range 2..36.", fromBase)); } if (toBase < 2 || toBase > 36) { throw new ArgumentException(string.Format("The toBase radix \"{0}\" is not in the range 2..36.", toBase)); } return(AnyRadixConvert.LongToString(AnyRadixConvert.StringToLong(value, fromBase), toBase)); }