NumberFormater.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Masuit.Tools.Strings
  5. {
  6. /// <summary>
  7. /// 数制格式化器
  8. /// </summary>
  9. public class NumberFormater
  10. {
  11. /// <summary>
  12. /// 数制表示字符集
  13. /// </summary>
  14. private string Characters { get; set; }
  15. /// <summary>
  16. /// 进制长度
  17. /// </summary>
  18. public int Length => Characters?.Length ?? 0;
  19. /// <summary>
  20. /// 数制格式化器
  21. /// </summary>
  22. public NumberFormater()
  23. {
  24. Characters = "0123456789";
  25. }
  26. /// <summary>
  27. /// 数制格式化器
  28. /// </summary>
  29. /// <param name="characters">进制转换</param>
  30. public NumberFormater(string characters)
  31. {
  32. Characters = characters;
  33. }
  34. /// <summary>
  35. /// 数制格式化器
  36. /// </summary>
  37. /// <param name="bin">进制</param>
  38. public NumberFormater(int bin)
  39. {
  40. if (bin < 2)
  41. {
  42. bin = 2;
  43. }
  44. if (bin > 62)
  45. {
  46. throw new ArgumentException("进制最大支持62进制");
  47. }
  48. Characters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".Substring(0, bin);
  49. }
  50. /// <summary>
  51. /// 数字转换为指定的进制形式字符串
  52. /// </summary>
  53. /// <param name="number"></param>
  54. /// <returns></returns>
  55. public string ToString(long number)
  56. {
  57. List<string> result = new List<string>();
  58. long t = number;
  59. while (t > 0)
  60. {
  61. var mod = t % Length;
  62. t = Math.Abs(t / Length);
  63. var character = Characters[Convert.ToInt32(mod)].ToString();
  64. result.Insert(0, character);
  65. }
  66. return string.Join("", result.ToArray());
  67. }
  68. /// <summary>
  69. /// 指定字符串转换为指定进制的数字形式
  70. /// </summary>
  71. /// <param name="str"></param>
  72. /// <returns></returns>
  73. public long FromString(string str)
  74. {
  75. long result = 0;
  76. int j = 0;
  77. foreach (var ch in new string(str.ToCharArray().Reverse().ToArray()))
  78. {
  79. if (Characters.Contains(ch))
  80. {
  81. result += Characters.IndexOf(ch) * (long)Math.Pow(Length, j);
  82. j++;
  83. }
  84. }
  85. return result;
  86. }
  87. /// <summary>Returns a string that represents the current object.</summary>
  88. /// <returns>A string that represents the current object.</returns>
  89. public override string ToString()
  90. {
  91. return Length + "模式";
  92. }
  93. }
  94. }