`

把金额转换为汉字和把一个 0~9999 之间的整数转换为汉字的字符串

    博客分类:
  • java
 
阅读更多

package cyachina.util;


/**
* To change this template use File | Settings | File Templates.
*/
public class MoneyUtil {

public static String[] chineseDigits = new String[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

/**
* 把金额转换为汉字表示的数量,小数点后四舍五入保留两位
* @param amount
* @return
*/
public static String amountToChinese(double amount) {

if(amount > 99999999999999.99 || amount < -99999999999999.99)
throw new IllegalArgumentException("参数值超出允许范围 (-99999999999999.99 ~ 99999999999999.99)!");

boolean negative = false;
if(amount < 0) {
negative = true;
amount = amount * (-1);
}

long temp = Math.round(amount * 100);
int numFen = (int)(temp % 10); // 分
temp = temp / 10;
int numJiao = (int)(temp % 10); //角
temp = temp / 10;
//temp 目前是金额的整数部分

int[] parts = new int[20]; // 其中的元素是把原来金额整数部分分割为值在 0~9999 之间的数的各个部分
int numParts = 0; // 记录把原来金额整数部分分割为了几个部分(每部分都在 0~9999 之间)
for(int i=0; ; i++) {
if(temp ==0)
break;
int part = (int)(temp % 10000);
parts[i] = part;
numParts ++;
temp = temp / 10000;
}

boolean beforeWanIsZero = true; // 标志“万”下面一级是不是 0

String chineseStr = "";
for(int i=0; i<numParts; i++) {

String partChinese = partTranslate(parts[i]);
if(i % 2 == 0) {
if("".equals(partChinese))
beforeWanIsZero = true;
else
beforeWanIsZero = false;
}

if(i != 0) {
if(i % 2 == 0)
chineseStr = "亿" + chineseStr;
else {
if("".equals(partChinese) && !beforeWanIsZero) // 如果“万”对应的 part 为 0,而“万”下面一级不为 0,则不加“万”,而加“零”
chineseStr = "零" + chineseStr;
else {
if(parts[i-1] < 1000 && parts[i-1] > 0) // 如果"万"的部分不为 0, 而"万"前面的部分小于 1000 大于 0, 则万后面应该跟“零”
chineseStr = "零" + chineseStr;
chineseStr = "万" + chineseStr;
}
}
}
chineseStr = partChinese + chineseStr;
}

if("".equals(chineseStr)) // 整数部分为 0, 则表达为"零元"
chineseStr = chineseDigits[0];
else if(negative) // 整数部分不为 0, 并且原金额为负数
chineseStr = "负" + chineseStr;

chineseStr = chineseStr + "元";

if(numFen == 0 && numJiao == 0) {
chineseStr = chineseStr + "整";
}
else if(numFen == 0) { // 0 分,角数不为 0
chineseStr = chineseStr + chineseDigits[numJiao] + "角";
}
else { // “分”数不为 0
if(numJiao == 0)
chineseStr = chineseStr + "零" + chineseDigits[numFen] + "分";
else
chineseStr = chineseStr + chineseDigits[numJiao] + "角" + chineseDigits[numFen] + "分";
}

return chineseStr;

}


/**
* 把一个 0~9999 之间的整数转换为汉字的字符串,如果是 0 则返回 ""
* @param amountPart
* @return
*/
private static String partTranslate(int amountPart) {

if(amountPart < 0 || amountPart > 10000) {
throw new IllegalArgumentException("参数必须是大于等于 0,小于 10000 的整数!");
}


String[] units = new String[] {"", "拾", "佰", "仟"};

int temp = amountPart;

String amountStr = new Integer(amountPart).toString();
int amountStrLength = amountStr.length();
boolean lastIsZero = true; //在从低位往高位循环时,记录上一位数字是不是 0
String chineseStr = "";

for(int i=0; i<amountStrLength; i++) {
if(temp == 0) // 高位已无数据
break;
int digit = temp % 10;
if(digit == 0) { // 取到的数字为 0
if(!lastIsZero) //前一个数字不是 0,则在当前汉字串前加“零”字;
chineseStr = "零" + chineseStr;
lastIsZero = true;
}
else { // 取到的数字不是 0
chineseStr = chineseDigits[digit] + units[i] + chineseStr;
lastIsZero = false;
}
temp = temp / 10;
}
return chineseStr;
}

public static void main(String[] args) {

if(args.length == 0) {
System.out.println("转换演示:");
System.out.println("-------------------------");
System.out.println("25000000000005.999: " + amountToChinese(25000000000005.999));
System.out.println("45689263.626: " + amountToChinese(45689263.626));
System.out.println("0.69457: " + amountToChinese(0.69457));
System.out.println("253.0: " + amountToChinese(253.0));
System.out.println("0: " + amountToChinese(0));
System.out.println("-------------------------");
System.out.println("本程序用法:");
System.out.println(" 演示: java MoneyUtil");
System.out.println(" 转换指定数字:java MoneyUtil [要转换的数字]");
//System.out.println(Long.MAX_VALUE);
//System.out.println(Long.MIN_VALUE);
}
else {
System.out.println("转换结果:");
System.out.println(args[0] + ": " + amountToChinese(Double.parseDouble(args[0])));
}

}

}

分享到:
评论

相关推荐

    TIA博途中字符串转换相关指令的使用方法(一).docx

    移动和转换字符串指令是指在 TIA 博途中将字符串从一个变量移动到另一个变量中,并进行格式转换的指令。常用的移动和转换字符串指令包括 S_MOVE 和 S_CONV 两个指令。 * S_MOVE 指令:可以将参数 IN 中的字符串写入...

    C++ 16进制和字符串批量转换

    在C++中,可以逐个字符处理字符串,将每个字符转换为它的ASCII值(这是一个8位无符号整数),然后将其转换为16进制格式。使用`std::stringstream`和`std::hex`可以方便地完成这个任务。以下是一个示例函数: ```...

    C语言 金额转换大写

    本篇文章将详细解析一个C语言编写的函数`LowMoneyToUpper`,该函数能够将小写金额转换为大写形式,并且支持的最大金额为`2^31-1`,即大约21亿。 #### 函数定义及参数说明 ```c void LowMoneyToUpper(double ...

    C#从16进制转换成汉字

    下面是一个简单的C#示例代码,演示了如何从16进制字符串转换为汉字: ```csharp using System; public class Program { public static void Main() { string hexStr = "4e2d"; // 16进制字符串,表示汉字“中” ...

    易语言汉字和ASCII码之间的转换

    总的来说,易语言提供了方便的工具和函数,使得开发者能够轻松地在汉字和ASCII码之间进行转换,这对于处理中文字符和英文字符混合的情况尤其有用。通过理解和熟练运用这些功能,可以有效地解决跨编码环境下的数据...

    SIMATIC Wincc中与字符串相关的函数使用方法(拷贝_比较_连接_转换)及举例说明.docx

    1. **strcpy()**:这个函数用于拷贝一个字符串到另一个字符串。在示例中,`pszValue` 的值被复制到 `a` 中。`strcpy()` 需要谨慎使用,因为它不检查目标字符串的长度,可能导致缓冲区溢出。为了安全起见,通常推荐...

    aotu.js 字符串指定字符 随机生成出汉字

    总之,`aotu.js`的字符串指定字符随机生成汉字的功能,结合JavaScript的字符串和数学操作,为前端开发者提供了一种强大的工具,用于创建动态和多样化的汉字内容。在实际应用中,它可以帮助提高引流脚本的效果,增加...

    八进制数值字符串转ASCII码字符串C#实现

    在C#中,我们可以使用`Convert.ToInt32()`函数将八进制字符串转换为整数,然后通过`char.ConvertFromUtf32()`方法将该整数转换为对应的ASCII字符。如果输入的是一串八进制数值字符串,我们需要先将它们分割,逐个...

    VB代码把\uxxxx转换成汉字

    在上述代码中,我们定义了一个名为`UnicodeToChinese`的函数,它接收一个形如`\uxxxx`的字符串,然后通过一系列步骤将其转换为对应的汉字。`Mid()`函数用于提取字符串的一部分,`Val()`函数配合`&H`前缀将16进制字符...

    pb字符串转十六进制及各进制之间转换源码

    PowerBuilder中的`Hex()`函数可以把整数值转换为十六进制字符串。如果我们要对字符串的每个字符分别转换,需要先将字符串转换成字节序列,然后逐个应用`Hex()`函数。例如: ```pb string strInput = "HelloWorld...

    将数字转换为大写金额字符串源码(C#)

    以下是一个关于“将数字转换为大写金额字符串”的详细知识点: 1. **数字与汉字的对应关系**: 在转换过程中,数字0到9需要对应相应的汉字,如0对应“零”,1对应“壹”,以此类推。同时,还需要处理特殊的大写...

    C#16进制unicode字符和汉字相互转换

    对于汉字到16进制Unicode的转换,我们需要首先获取汉字的Unicode码点,这通常通过`char.GetHashCode()`或者`char.GetUnicodeCategory()`等方法获取,然后将得到的码点转换为16进制字符串。 在实际开发中,我们可能...

    数字大小写转换(转换为汉字大写)

    在MFC中实现数字到汉字大写的转换,可以创建一个函数,接受一个double或int作为参数,返回一个表示汉字大写的字符串。该函数可以使用字符串模板(std::string)和MFC的 CString 类来处理和返回结果。同时,利用MFC的...

    java实现字符转换成十六进制的ASCII码

    在Java中,我们可以使用`Integer.toHexString()`方法轻松地将一个整数转换为16进制字符串。 下面,我们来看`StringToAscii.java`文件中的实现方式,它主要涉及到字符到整数的转换和整数到16进制的转换。由于没有...

    NetShowTool(整数转字符串工具)v2.0中文免费绿色版

    NetShowTool(整数转字符串工具)是一款绿色小巧的整数转换成字符串工具,NetShowTool支持时间格式转换和IP转换,能够将时间(整数)转换为字符串,将IP(整数)转换为字符串,需要的朋友赶快下载使用吧! 软件功能 1、...

    小写金额转大写金额(C++)

    本问题涉及的是一个具体的C++程序设计任务:将小写金额转换为大写的中文表示。这个功能在财务软件、银行系统或者会计应用中非常有用,因为它能够帮助确保金额的正确性和规范性。 在中文中,大写金额的表示法与小写...

    C# - 阿拉伯数字金额转换为繁体数字金额

    这个特定的项目“C# - 阿拉伯数字金额转换为繁体数字金额”专注于一个常见的财务处理任务,即把通常用阿拉伯数字表示的货币金额转化为繁体中文的表示方式。这在中文环境中特别有用,因为繁体数字在正式的商业文档和...

    浮点数转换为汉文字符串

    实现把不超过12位整数的浮点数转换为中文读法的字符串并保留两位小数

    输入数字转换为大写金额输出

    本示例展示了如何使用C语言中的递归函数和字符串操作技巧来实现数字到大写金额的转换。通过递归的方式,我们可以更加简洁地处理每一位数字的转换工作,使得代码更加清晰易懂。这种方法不仅适用于简单的金额转换场景...

    易语言十六进制与字符串转换源码

    4. **二进制数据与字符串之间的转换**:有时我们需要将二进制数据(例如文件内容)转换为字符串,以便于处理和存储,反之亦然。易语言提供了`读文件到字节集`、`写字节集到文件`、`字节集到字符串`和`字符串到字节集...

Global site tag (gtag.js) - Google Analytics