zoukankan      html  css  js  c++  java
  • java/C#实现数字金额转换中文大写金额精确毫厘

        C#版本    
                  
        private const string DXSZ = "零壹贰叁肆伍陆柒捌玖"; private const string DXDW = "毫厘分角元拾佰仟萬拾佰仟亿拾佰仟萬兆拾佰仟萬亿京拾佰仟萬亿兆垓"; private const string SCDW = "元拾佰仟萬亿京兆垓"; /// <summary> /// 转换整数为大写金额 /// </summary> /// <param name="capValue">整数值</param> /// <returns>返回大写金额</returns> private static string ConvertIntToUppercaseAmount(string capValue) { string currCap = ""; //当前金额 string capResult = ""; //结果金额 string currentUnit = "";//当前单位 string resultUnit = ""; //结果单位 int prevChar = -1; //上一位的值 int currChar = 0; //当前位的值 int posIndex = 4; //位置索引,从"元"开始 if (Convert.ToDouble(capValue) == 0) return ""; for (int i = capValue.Length - 1; i >= 0; i--) { currChar = Convert.ToInt16(capValue.Substring(i, 1)); if (posIndex > 30) { //已超出最大精度"垓"。注:可以将30改成22,使之精确到兆亿就足够了 break; } else if (currChar != 0) { //当前位为非零值,则直接转换成大写金额 currCap = DXSZ.Substring(currChar, 1) + DXDW.Substring(posIndex, 1); } else { //防止转换后出现多余的零,例如:3000020 switch (posIndex) { case 4: currCap = "元"; break; case 8: currCap = "萬"; break; case 12: currCap = "亿"; break; case 17: currCap = "兆"; break; case 23: currCap = "京"; break; case 30: currCap = "垓"; break; default: break; } if (prevChar != 0) { if (currCap != "") { if (currCap != "元") currCap += "零"; } else { currCap = "零"; } } } //对结果进行容错处理 if (capResult.Length > 0) { resultUnit = capResult.Substring(0, 1); currentUnit = DXDW.Substring(posIndex, 1); if (SCDW.IndexOf(resultUnit) > 0) { if (SCDW.IndexOf(currentUnit) > SCDW.IndexOf(resultUnit)) { capResult = capResult.Substring(1); } } } capResult = currCap + capResult; prevChar = currChar; posIndex += 1; currCap = ""; } return capResult; } /// <summary> /// 转换小数为大写金额 /// </summary> /// <param name="capValue">小数值</param> /// <param name="addZero">是否增加零位</param> /// <returns>返回大写金额</returns> private static string ConvertDecToUppercaseAmount(string capValue, bool addZero) { string currCap = ""; string capResult = ""; int prevChar = addZero ? -1 : 0; int currChar = 0; int posIndex = 3; if (Convert.ToInt16(capValue) == 0) return ""; for (int i = 0; i < capValue.Length; i++) { currChar = Convert.ToInt16(capValue.Substring(i, 1)); if (currChar != 0) { currCap = DXSZ.Substring(currChar, 1) + DXDW.Substring(posIndex, 1); } else { if (Convert.ToInt16(capValue.Substring(i)) == 0) { break; } else if (prevChar != 0) { currCap = "零"; } } capResult += currCap; prevChar = currChar; posIndex -= 1; currCap = ""; } return capResult; } /// <summary> /// 人民币大写金额 /// </summary> /// <param name="value">人民币数字金额值</param> /// <returns>返回人民币大写金额</returns> public static string RMBAmount(double value) { string capResult = ""; string capValue = string.Format("{0:f4}", value); //格式化 int dotPos = capValue.IndexOf("."); //小数点位置 bool addInt = (Convert.ToInt32(capValue.Substring(dotPos + 1)) == 0);//是否在结果中加"整" bool addMinus = (capValue.Substring(0, 1) == "-"); //是否在结果中加"负" int beginPos = addMinus ? 1 : 0; //开始位置 string capInt = capValue.Substring(beginPos, dotPos); //整数 string capDec = capValue.Substring(dotPos + 1); //小数 if (dotPos > 0) { capResult = ConvertIntToUppercaseAmount(capInt) + ConvertDecToUppercaseAmount(capDec, Convert.ToDouble(capInt) != 0 ? true : false); } else { capResult = ConvertIntToUppercaseAmount(capDec); } if (addMinus) capResult = "负" + capResult; if (addInt) capResult += "整"; return capResult; }

      

    //     Java版本

         private static String DXSZ = "零壹贰叁肆伍陆柒捌玖"; 2 private static String DXDW = "毫厘分角元拾佰仟萬拾佰仟亿拾佰仟萬兆拾佰仟萬亿京拾佰仟萬亿兆垓"; 3 private static String SCDW = "元拾佰仟萬亿京兆垓"; 4 5 /// <summary> 6 /// 转换整数为大写金额 7 /// </summary> 8 /// <param name="capValue">整数值</param> 9 /// <returns>返回大写金额</returns> 10 private static String ConvertIntToUppercaseAmount(String capValue) 11 { 12 String currCap = ""; //当前金额 13 String capResult = ""; //结果金额 14 String currentUnit = "";//当前单位 15 String resultUnit = ""; //结果单位 16 int prevChar = -1; //上一位的值 17 int currChar = 0; //当前位的值 18 int posIndex = 4; //位置索引,从"元"开始 19 20 if (new BigDecimal(capValue).compareTo(new BigDecimal(0))==0) return ""; 21 for (int i = capValue.length() - 1; i >= 0; i--) 22 { 23 currChar = Integer.parseInt(capValue.substring(i, i+1)); 24 if (posIndex > 30) 25 { 26 //已超出最大精度"垓"。注:可以将30改成22,使之精确到兆亿就足够了 27 break; 28 } 29 else if (currChar != 0) 30 { 31 //当前位为非零值,则直接转换成大写金额 32 currCap = DXSZ.substring(currChar, currChar+1) + DXDW.substring(posIndex, posIndex+1); 33 } 34 else 35 { 36 //防止转换后出现多余的零,例如:3000020 37 switch (posIndex) 38 { 39 case 4: currCap = "元"; break; 40 case 8: currCap = "萬"; break; 41 case 12: currCap = "亿"; break; 42 case 17: currCap = "兆"; break; 43 case 23: currCap = "京"; break; 44 case 30: currCap = "垓"; break; 45 default: break; 46 } 47 if (prevChar != 0) 48 { 49 if (currCap != "") 50 { 51 if (currCap != "元") currCap += "零"; 52 } 53 else 54 { 55 currCap = "零"; 56 } 57 } 58 } 59 //对结果进行容错处理 60 if (capResult.length() > 0) 61 { 62 resultUnit = capResult.substring(0, 0+1); 63 currentUnit = DXDW.substring(posIndex, posIndex+1); 64 if (SCDW.indexOf(resultUnit) > 0) 65 { 66 if (SCDW.indexOf(currentUnit) > SCDW.indexOf(resultUnit)) 67 { 68 capResult = capResult.substring(1); 69 } 70 } 71 } 72 capResult = currCap + capResult; 73 prevChar = currChar; 74 posIndex += 1; 75 currCap = ""; 76 } 77 return capResult; 78 } 79 80 /// <summary> 81 /// 转换小数为大写金额 82 /// </summary> 83 /// <param name="capValue">小数值</param> 84 /// <param name="addZero">是否增加零位</param> 85 /// <returns>返回大写金额</returns> 86 private static String ConvertDecToUppercaseAmount(String capValue, boolean addZero) 87 { 88 String currCap = ""; 89 String capResult = ""; 90 int prevChar = addZero ? -1 : 0; 91 int currChar = 0; 92 int posIndex = 3; 93 94 if (new BigDecimal(capValue).compareTo(new BigDecimal(0))==0) return ""; 95 for (int i = 0; i < capValue.length(); i++) 96 { 97 currChar = Integer.parseInt(capValue.substring(i, i+1)); 98 if (currChar != 0) 99 { 100 currCap = DXSZ.substring(currChar, currChar+1) + DXDW.substring(posIndex, posIndex+1); 101 } 102 else 103 { 104 if (Integer.parseInt(capValue.substring(i)) == 0) 105 { 106 break; 107 } 108 else if (prevChar != 0) 109 { 110 currCap = "零"; 111 } 112 } 113 capResult += currCap; 114 prevChar = currChar; 115 posIndex -= 1; 116 currCap = ""; 117 } 118 return capResult; 119 } 120 121 /// <summary> 122 /// 人民币大写金额 123 /// </summary> 124 /// <param name="value">人民币数字金额值</param> 125 /// <returns>返回人民币大写金额</returns> 126 public static String RMBAmount(String value) 127 { 128 String capResult = ""; 129 String capValue = new BigDecimal(value).setScale(4,BigDecimal.ROUND_HALF_UP).toString(); 130 //String capValue = String.Format("{0:f4}", value); //格式化 131 int dotPos = capValue.indexOf("."); //小数点位置 132 boolean addInt = (Integer.parseInt(capValue.substring(dotPos +1)) == 0);//是否在结果中加"整" 133 boolean addMinus = (capValue.substring(0, 1) == "-"); //是否在结果中加"负" 134 int beginPos = addMinus ? 1 : 0; //开始位置 135 String capInt = capValue.substring(beginPos, beginPos+dotPos); //整数 136 String capDec = capValue.substring(dotPos + 1); //小数 137 138 if (dotPos > 0) 139 { 140 boolean addZero= (new BigDecimal(capInt).compareTo(new BigDecimal(0)))!=0?true:false; 141 capResult = ConvertIntToUppercaseAmount(capInt) + 142 ConvertDecToUppercaseAmount(capDec, addZero); 143 } 144 else 145 { 146 capResult = ConvertIntToUppercaseAmount(capDec); 147 } 148 if (addMinus) capResult = "负" + capResult; 149 if (addInt) capResult += "整"; 150 return capResult; 151 }
  • 相关阅读:
    《深入V8引擎-第01课》
    《各 JavaScript 引擎的简介,及相关资料》
    《【前端性能】必须要掌握的原生JS实现JQuery》
    《[iOS][OC] 开发利器:控制器传送门VCPicker(附demo)》
    《iOS 上的 CSS 样式协议 VKCssProtocol》
    ICML 2019论文录取Top100:谷歌霸榜
    进阶!自然语言处理背后的数据科学
    学界!关于GAN的灵魂七问
    如何优化深度学习模型
    从DeepNet到HRNet,这有一份深度学习“人体姿势估计”全指南
  • 原文地址:https://www.cnblogs.com/yangkangIT/p/9052179.html
Copyright © 2011-2022 走看看