小弟初学Java, 刚编写了一个程序,是将浮点数转成人民币读法字符串。该程序的java源文件代码如下——
import java.util.*;
public class Num2Rmb
{
private String[] hanArr= {"零" , "壹" , "贰" , "叁" , "肆" ,
"伍" , "陆" , "柒" , "捌" , "玖"};
private String[] unitArr = {"十", "百", "千"};
/**
* 把一个浮点数分解成整数部分和小数部分字符串
* @param num 需要被分解的浮点数
* @return 分解出来的整数部分和小数部分构成的数组。第一个数组元素是整数部分,第二个数组元素是小数部分。
*/
private String[] divide(double num)
{
//将一个浮点数强制类型转换为long,即得到它的整数部分。
long zheng = (long)num;
//浮点数减去整数部分,得到小数部分,小数部分乘以100后再取整得到2位小数。
//Math类的round方法,返回与参数最接近(经四舍五入后)的整数。
long xiao = Math.round((num - zheng) * 100);
//下面用了2种方法把整数转换为字符串。
//return一个匿名数组。
//String类的valueOf(int i)方法,返回整数参数的字符串表达式。
return new String[]{zheng + ","+ String.valueOf(xiao)};
}
/**
* 把一个12位以内的数字字符串变成汉字字符串
* @param numStr 需要被转换的数字字符串
* @return 数字字符串被转换成的汉字字符串。
*/
private String toHanStr(String numStr)
{
int strLen = numStr.length();
int yu = strLen % 4;
//partNum表示该数字字符串可划分成的节数(每4位为一节)。
//如余数等于0,则将strLen/4赋值给partNum;否则将strLen/4 + 1赋值给partNum。
int partNum = yu == 0 ? strLen/4 : strLen/4 + 1;
//firstPartLen表示第一节的长度
int firstPartLen = strLen - (partNum - 1)*4;
String resultFirst = "";
String resultSecond = "";
String resultThird = "";
//依次遍历数字字符串的每一节
for (int i = 0 ; i < partNum ; i ++ )
{
//转换第一节
if (i == 0)
{
//通过调用String类的substring方法来返回子串 [beginIndex, endIndex),
//即:包括起始索引,不包括结束索引。
String firstPart = numStr.substring(0, firstPartLen);
//依次遍历第一节中的每一位数字
for (int j = 0 ; j < firstPartLen ; j ++ )
{
//String类的charAt(int index),返回指定索引处的字符串值。(类似于数组)。
//把char型数字转换成的int型数字,因为它们的ASCII码值恰好相差48;
//因此把char型数字减去48得到int型数字,例如'4'被转换成4。
int num = firstPart.charAt(j) - 48;
//如果不是最后一位数字,而且数字不是零,则需要添加单位(十、百、千)
if (j != firstPartLen-1 && num != 0)
{
resultFirst += hanArr[num] + unitArr[firstPartLen - 2 - j];
}
//如果是最后一位数字,而且数字不是零,则不要添加单位
else if (j == firstPartLen - 1 && num != 0)
{
resultFirst += hanArr[num];
}
//如果这一节的中间两个数字为0, 且第一位和最后一位数字不为0, 则需要读出一个零
else if (j == 2 && num == 0 && firstPart.charAt(1) - 48 == 0
&& firstPart.charAt(0) - 48 != 0
&& firstPart.charAt(firstPartLen - 1) - 48 != 0)
{
resultFirst += hanArr[num];
}
//剩下的就是hanArr和unitArr都不需要读出来的情况
}
}
//转换第二节
else if (i == 1)
{
String secondPart = numStr.substring(firstPartLen, (firstPartLen + 4));
int secPartLen = secondPart.length();
for (int k = 0 ; k < secPartLen ; k ++ )
{
int num = secondPart.charAt(k) - 48;
if (k != secPartLen-1 && num != 0)
{
resultSecond += hanArr[num] + unitArr[secPartLen - 2 - k];
}
else if (k == secPartLen - 1 && num != 0)
{
resultSecond += hanArr[num];
}
else if (k == 2 && num == 0 && secondPart.charAt(1) - 48 == 0
&& secondPart.charAt(secPartLen - 1) - 48 != 0)
{
resultSecond += hanArr[num];
}
}
//如果四位数字全是0, 且第二节不是最后一节, 则只需读出一个零。
//Integer类的parseInt(String s)方法:将整数字符串参数解析成一个带符号的十进制整数。
if (Integer.parseInt(secondPart) == 0 && partNum == 3)
{
resultSecond = hanArr[0];
}
}
//转换第三节
else if (i == 2)
{
String thirdPart = numStr.substring((firstPartLen + 4), strLen);
int thirdPartLen = thirdPart.length();
for (i = 0 ; i < thirdPartLen ; i ++ )
{
int num = thirdPart.charAt(i) - 48;
if (i != thirdPartLen-1 && num != 0)
{
resultThird += hanArr[num] + unitArr[thirdPartLen - 2 - i];
}
else if (i == thirdPartLen - 1 && num != 0)
{
resultThird += hanArr[num];
}
else if (i == 2 && num == 0 && thirdPart.charAt(1) - 48 == 0
&& thirdPart.charAt(thirdPartLen - 1) - 48 != 0)
{
resultThird += hanArr[num];
}
}
}
}
String result = "";
if (partNum == 1)
{
//如果数字仅为0
if (resultFirst == "")
{
result = hanArr[0] + "元";
}
else
{
result = resultFirst + "元";
}
}
else if (partNum == 2)
{
//如果第二节全为0
if (Integer.parseInt(numStr.substring(firstPartLen, (firstPartLen + 4))) == 0)
{
result = resultFirst + "万";
}
else
{
result = resultFirst + "万" + " " + resultSecond+ "元";
}
}
else if (partNum == 3)
{
result = resultFirst + "亿" + " " + resultSecond + "万" + " " + resultThird+ "元";
//如果第二节和第三节均全为0
if (Integer.parseInt(numStr.substring(firstPartLen, (firstPartLen + 4))) == 0
&& Integer.parseInt(numStr.substring((firstPartLen + 4), strLen)) == 0)
{
result = resultFirst + "亿";
}
}
return result;
}
public static void main(String[] args)
{
//等号左边的Num2Rmb是nr的变量类型,右边的Num2Rmb是构造器名
Num2Rmb nr = new Num2Rmb();
//测试把一个浮点数236711125.123分解成整数部分和小数部分
System.out.println(Arrays.toString(nr.divide(236711125.123)));
//测试把一个12位以内的数字字符串变成汉字字符串
System.out.println(nr.toHanStr("123456789123"));
}
}
分享到:
相关推荐
总的来说,将浮点数转换为人民币读法是一个涉及数值处理、字符串操作和格式化技术的综合性问题,通过这个实践可以加深对Java编程的理解,并提升编程技巧。在实际工作中,这样的转换可能还会涉及到多语言环境下的本地...
在C语言中,将浮点数转换为字符串是一项常见的任务,尤其在需要将数值数据输出到文件或屏幕上时。这个过程通常涉及到`printf`函数家族的使用,它们能够按照指定的格式将各种类型的数据转化为可读的字符串。本文将...
labview IEE754浮点数转换程序,通过串口采集到的十六进制字符串转换成单精度的浮点数,浮点数转换成十六进制字符串
将浮点数和整数转化为字符串,在VC6.0上已经通过的。。。
学习c过程中,编写的浮点数转成ASCII字符串的函数,包括源代码和测试程序,在gcc-3.4.5-20060117-3和VS2008下均编译通过,并运行结果正确。 如果你在测试的过程中发现输出结果不正确,欢迎跟我联系,以便进一步改进...
把浮点数转换成字符串,主要应用串口显示,和数据的存储!
本文将深入探讨十六进制字符串与浮点数、整型之间的转换,并提供在Qt和VC2010环境下实现这些转换的源代码。 首先,我们要理解不同进制的概念。在计算机科学中,我们常用的是二进制、八进制、十进制和十六进制。十六...
本文旨在探讨一种特殊的浮点数转字符串的方法——定点法。该方法通过对IEEE 754标准下的浮点数编码规则进行硬解码,进而实现浮点数到字符串的转换。尽管这种方法在效率上不及其他常规手段,但在精度方面具有显著优势...
电子-浮点数转换成字符串.c,单片机/嵌入式STM32-F0/F1/F2
JavaScript实现浮点数转十六进制字符的过程涉及到了浮点数的表示、IEEE 754标准、二进制与十六进制的转换等多个知识点。由于JavaScript直接使用浮点数转十六进制的功能实现并不直接,因此需要借助其他方法来实现。...
在单片机编程中,数据类型的处理至关重要...`float_2_char`的源代码应该包含了这些转换的具体实现,通过学习和理解这些代码,可以更好地掌握在单片机环境下处理浮点数和字符型数据的方法,从而提高程序的效率和可靠性。
VBA实现单精度浮点数与十六进制字符串相互转换,并提供2个相互转换的示例 第一个按钮: "A1录入十六进制8位字符串; B1输出单精度浮点数结果" 第二个按钮 "将B1作为单精度浮点数输入 C1输出16进制结果
将浮点数转化为人民币读法的字符串。如1006.333转为壹仟零陆元三角三分。
本文将详细讲解如何使用C语言实现浮点数与字符串之间的转换,以满足标题和描述中提到的需求。 首先,让我们讨论浮点数转字符串的过程。在C语言中,这个过程通常通过`printf`系列函数的`%f`格式化选项来完成。但是,...
实现把不超过12位整数的浮点数转换为中文读法的字符串并保留两位小数
本程序使用C#实现,使用的模板为“控制台应用... 本程序的功能是将IEEE754的32位浮点数转换为与其相对应的比特流字符串。 本程序的目的是为了完成一个编译器中需要将一个浮点数翻译为32位二进制的存储形式的子功能。
当我们要将一个浮点数转换为16进制字符串时,实际上是把这32位二进制数据转换成16进制表示。 1. **浮点数转16进制字符串**: 这个过程可以通过`BitConverter`类来完成。`BitConverter.SingleToUInt32Bits`方法可以...
在给定的场景中,我们关注的是如何在VC++环境下将一个32位浮点数转换成8字节的16进制字符串。这种转换涉及到计算机内部浮点数的二进制表示以及如何将这种表示转换为人类可读的十六进制格式。 首先,我们需要理解...
具体来说,可以使用“字符串到整数”函数将16进制字符串转换为整数,然后通过“整数到二进制”函数获取二进制表示,接着利用自定义逻辑或者LabVIEW内置的“浮点数到字节”和“字节到浮点数”函数完成解析和转换。...
1. 字符串转浮点数:与整型转换类似,我们使用`float()`函数将字符串转换为浮点数。同样,字符串必须能表示一个有效的浮点数。 ```python str_float = "3.14" float_num = float(str_float) print(float_num) # 输出...