本帖最后由 罗会涛 于 2012-11-4 02:16 编辑
写了好久- /*
- * 要求:编写一个程序,将浮点数转换成人民币读法字符串。例如:1235.22转换为壹仟贰佰叁拾伍元贰角贰分.
- * 思路:1.将浮点数先转成字符串,按.将其分成整数和小数部分分别处理;
- * 2.再将字符串转成数字不停除10取模,商就是该位的单位math_units、模就是数字繁体字number_units;
- * 3.用数组将单位和繁体字存起来,直接用角标找到即可.
- * 几个问题:
- * 1.零的问题,什么时候写零,怎么控制.
- * 2.各种数字不合规范的验证
- * 另外当数字是10、100000时输出是壹拾圆和壹拾万圆与口语不符,更改又得加很多判断
- * 而且我觉得这个题目不该用float,它常常丢失精度导致输出的结果不对甚至报错如:999999.99,增加角分加了难度但带来了很多问题应该不是初衷
- */
- public class ChangeToRMB
- {
- private static String[] math_units = { "", "拾", "佰", "仟", "万", "拾", "佰",
- "仟", "亿", "拾", "佰", "仟", "万" };
- private static char[] number_units = { '零', '壹', '贰', '叁', '肆', '伍', '陆',
- '柒', '捌', '玖' };
- // 专门定义一个boolean变量来控制打印结果中是否输出"零",一写零就赋false,一写繁体字就赋true
- private static boolean hasZero = false;
- private static StringBuffer countIntPart(String s)
- {
- int mathIndex = 0;
- StringBuffer sb = null;
- int temp = Integer.parseInt(s);
- int remainder = temp % 10;
- if (temp == 0)
- return null;
- else
- sb = new StringBuffer("圆");
- // 其实mathIndex取不到11即千亿级别,float早就改用科学计数法表示了
- for (; temp / 10 > 0 && mathIndex < 12; temp = temp / 10, remainder = temp % 10, mathIndex++)
- {
- if (remainder == 0)
- {
- if (hasZero)
- {
- sb.append("零");
- hasZero = false;
- }
- /* 这里单独在mathIndex为4时加个万字,是数字大于1万而万位刚好为0时会导致打印结果缺失万字*/
- if (mathIndex == 4)
- {
- sb.append("万");
- }
- }
- else if (remainder != 0)
- {
- sb.append(math_units[mathIndex]);
- sb.append(number_units[remainder]);
- hasZero = true;
- }
- }
- hasZero = true;
- sb.append(math_units[mathIndex]);
- sb.append(number_units[remainder]);
- sb = sb.reverse();
- return sb;
- }
- /* 对小数部分进行操作 */
- private static String countPointPart(String s)
- {
- String str = null;
- if (s.length() > 2)
- {
- System.out.println("最多只能精确到分,多余的部分将舍弃!");
- }
- s = s + "0"; // 浮点型可能将多位小数变成一位,导致从0-2位取值时错误,所以在字符串后面加个0
- int temp = Integer.parseInt(s.substring(0, 2));
- if (temp == 0)
- {
- return null;
- }
- else if (temp / 10 > 0)
- {
- str = number_units[temp / 10] + "角";
- if (temp % 10 != 0)
- {
- str = str + number_units[temp % 10] + "分";
- }
- }
- else if (hasZero)
- {
- str = "零" + number_units[temp] + "分";
- }
- else
- {
- str = number_units[temp] + "分";
- }
- hasZero = false;
- return str;
- }
- private static void change(float f)
- {
- if (f < 0)
- {
- System.out.println("您输入的数字不合法!");
- return;
- }
- if (String.valueOf(f).contains("E")) // 数字过大时会用科学计数法表示导致错误发生
- {
- System.out.println("您输入的数字过大,无法转换!");
- return;
- }
- String[] arr = String.valueOf(f).split("\\.");
- StringBuffer sbInt = countIntPart(arr[0]);
- String s = countPointPart(arr[1]);
- StringBuffer sbPoint = null;
- /* 将两部分合并时可能有一部分是null,必须分开讨论 */
- if (s != null)
- {
- sbPoint = new StringBuffer(s);
- }
- if (f == 0)
- {
- System.out.println("零");
- }
- else if (sbInt != null && sbPoint != null)
- {
- System.out.println(sbInt.append(sbPoint));
- }
- else if (sbInt == null)
- {
- System.out.println(sbPoint);
- }
- else
- System.out.println(sbInt);
- }
- public static void main(String[] args)
- {
- float f1 = 670005.87f;
- float f2 = 1005.22f;
- float f3 = 123056.05f;
- // System.out.println(f1);
- // System.out.println(f2);
- // System.out.println(f3);
- change(f1);
- change(f2);
- change(f3);
- }
- }
复制代码 |