AmountUtils.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using System;
  2. namespace JiaZhiQuan.Common.Utils
  3. {
  4. public static class AmountUtils
  5. {
  6. /// <summary>
  7. /// 转换 元 -> 分
  8. /// </summary>
  9. /// <param name="amount"></param>
  10. /// <returns></returns>
  11. public static int ConvertYuanToCent(decimal amount)
  12. {
  13. return (int)(amount * 100);
  14. }
  15. /// <summary>
  16. /// 百分比转小数
  17. /// </summary>
  18. /// <param name="cent"></param>
  19. /// <returns></returns>
  20. public static decimal ConvertPercentToDeciaml(decimal d)
  21. {
  22. return d / 100;
  23. }
  24. /// <summary>
  25. /// 小数转百分比(保留两位小数)
  26. /// </summary>
  27. /// <param name="cent"></param>
  28. /// <returns></returns>
  29. public static string ConvertDeciamlToPercent(decimal d)
  30. {
  31. return $"{AmountUtils.ConvertRoundReserveTwoDecimal(d * 100).ToString("0.00")}%";
  32. }
  33. /// <summary>
  34. /// 分转元(不会牵扯到四舍五入)
  35. /// </summary>
  36. /// <param name="cent"></param>
  37. /// <returns></returns>
  38. public static decimal ConvertCentToYuan(decimal cent)
  39. {
  40. return cent / 100m;
  41. }
  42. /// <summary>
  43. /// 分转元(保留两位小数, 不会牵扯到四舍五入)
  44. /// </summary>
  45. /// <param name="cent"></param>
  46. /// <returns></returns>
  47. public static string ConvertCentToYuanStr(decimal cent)
  48. {
  49. return ConvertCentToYuan(cent).ToString("0.00");
  50. }
  51. /// <summary>
  52. /// 四舍五入,保留两位小数
  53. /// </summary>
  54. /// <param name="d"></param>
  55. /// <returns></returns>
  56. public static decimal ConvertRoundReserveTwoDecimal(decimal d)
  57. {
  58. return Math.Round(d, 2, MidpointRounding.AwayFromZero);
  59. }
  60. /// <summary>
  61. /// 四舍五入,取整
  62. /// </summary>
  63. /// <param name="d"></param>
  64. /// <returns></returns>
  65. public static int ConvertRoundReserveRound(decimal d)
  66. {
  67. return (int)Math.Round(d, 0, MidpointRounding.AwayFromZero);
  68. }
  69. /// <summary>
  70. /// 计算税费(四舍五入取整)
  71. /// </summary>
  72. /// <param name="amount">总金额(分)</param>
  73. /// <param name="taxRate">税率</param>
  74. /// <returns></returns>
  75. public static int ComputeTaxAmount(int amount, decimal taxRate)
  76. {
  77. // (四舍五入保留整数)总税额 = 总金额(分) * 税率
  78. return AmountUtils.ConvertRoundReserveRound(amount * taxRate);
  79. }
  80. /// <summary>
  81. /// 计算服务费(四舍五入取整)
  82. /// </summary>
  83. /// <param name="amount">总金额(分)</param>
  84. /// <param name="taxRate">服务费率</param>
  85. /// <returns></returns>
  86. public static int ComputeFeeAmount(int amount, decimal feeRate)
  87. {
  88. // (四舍五入保留整数)总服务费 = 总金额(分) * 服务费率
  89. return AmountUtils.ConvertRoundReserveRound(amount * feeRate);
  90. }
  91. /// <summary>
  92. /// 计算真实金额
  93. /// </summary>
  94. /// <param name="amount">总金额(分)</param>
  95. /// <param name="taxRate">税率</param>
  96. /// <param name="feeRate">服务费率</param>
  97. /// <param name="feeMinAmount">服务费最低金额(分)</param>
  98. /// <returns></returns>
  99. public static int ComputeRealAmount(int amount, decimal taxRate, decimal feeRate, int feeMinAmount)
  100. {
  101. // 去税总金额(分) = 总金额(分) - 税费
  102. int amount1 = amount - ComputeTaxAmount(amount, taxRate);
  103. // 打款总金额(分) = 去税总金额(分) - 服务费(服务费有最低限制,如果计算的服务费小于最低限制,那么使用最低限制)
  104. int amount2 = amount1 - Math.Max(ComputeFeeAmount(amount1, feeRate), feeMinAmount);
  105. return amount2;
  106. }
  107. }
  108. }