SysConvert.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package cc.xiaokuihua.analysis.utils;
  2. public class SysConvert {
  3. //声明当前对象
  4. private static SysConvert instance = new SysConvert();
  5. //可用计数字符
  6. private static String unit = "0123456789abcdefghijklmnopqrstuvwxyz";
  7. //输入数字
  8. private String number;
  9. //输入进制
  10. private int sysIn;
  11. //输出进制
  12. private int sysOut;
  13. //输入实际值
  14. private double actualValue;
  15. //小数计算精度
  16. private int precision;
  17. //用于存放结果
  18. private StringBuilder result = new StringBuilder();
  19. private SysConvert() {
  20. }
  21. public static SysConvert getInstance() {
  22. return instance;
  23. }
  24. /**
  25. * 获取当前位所代表的值
  26. *
  27. * @param sys 进制数
  28. * @param index 距离小数点的距离
  29. * @param var 当前位表示字符
  30. * @return 当前位所代表的值
  31. */
  32. private static double changeNI(int sys, int index, char var) {
  33. return unit.indexOf(var) * Math.pow(sys, index);
  34. }
  35. /**
  36. * 将值转化为对应进制表示字符
  37. *
  38. * @param sys 进制数
  39. * @param var 值
  40. * @return 对应进制表示字符
  41. */
  42. private static char changeIN(int sys, int var) {
  43. return unit.charAt(var);
  44. }
  45. /**
  46. * 计算实际值
  47. */
  48. private void calculateActualValue() {
  49. //检查小数点
  50. int pointIndex = number.indexOf('.');
  51. //计算整数部分
  52. if (pointIndex < 0) {//如果没有小数部分
  53. for (int i = 0; i < number.length(); i++) {
  54. actualValue += (long) changeNI(sysIn, i, number.charAt(number.length() - i - 1));
  55. }
  56. } else {//有则
  57. for (int i = 0; i < pointIndex; i++) {
  58. actualValue += (long) changeNI(sysIn, i, number.charAt(pointIndex - i - 1));
  59. }
  60. }
  61. if (!(pointIndex < 0)) {//如果有小数部分
  62. //计算小数部分
  63. for (int i = pointIndex + 1; i < number.length(); i++) {
  64. actualValue += changeNI(sysIn, pointIndex - i, number.charAt(i));
  65. }
  66. }
  67. }
  68. /**
  69. * 转换为指定进制
  70. */
  71. private void Convert() {
  72. //分离整数和小数
  73. long integerPart = (long) actualValue;
  74. double decimalsPart = actualValue - integerPart;
  75. //建立字符串以用于保存结果
  76. while (integerPart >= sysOut) { //反复除进制,取余数
  77. result.insert(0, changeIN(sysOut, (int) (integerPart % sysOut))); //追加结果
  78. integerPart = integerPart / sysOut;//商
  79. }
  80. if (integerPart != 0) { //如果最后未被除尽
  81. result.insert(0, changeIN(sysOut, (int) integerPart)); //追加结果
  82. }
  83. if (decimalsPart > 0) { //如果有小数部分
  84. //添加小数点
  85. result.append(".");
  86. for (int t = 0; t < precision; t++) {
  87. decimalsPart = decimalsPart * sysOut;
  88. result.append(changeIN(sysOut, (int) decimalsPart));
  89. decimalsPart = decimalsPart - (int) decimalsPart;
  90. }
  91. }
  92. }
  93. /**
  94. * 进制转换
  95. *
  96. * @param sysIn 输入进制(Input base)
  97. * @param sysOut 输出进制(Output base)
  98. * @param number 输入数字(Input number)
  99. * @param precision 输出精度(非小数此参数无效)(Output precision (non-decimal this parameter is not valid))
  100. * @return 输出转换结果
  101. */
  102. public String Convert(int sysIn, int sysOut, String number, int precision) {
  103. this.sysIn = sysIn;
  104. this.sysOut = sysOut;
  105. this.number = number;
  106. this.precision = precision;
  107. actualValue = 0;
  108. result.delete(0, result.length());
  109. calculateActualValue();
  110. Convert();
  111. return result.toString();
  112. }
  113. }