将数字转为中文金额的大写方式(Java版) 紫竹大哥面试华为如何了,不该发这里,呵呵。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 呵呵....如果是繁体操作系统呢? 自己写的一个大写装换类,集思广益,共享一下:)/** * @author Jason * */public class DaxieUtil { /** * 阿拉伯数字对应的汉字大写字符集合. */ private static char[] N = new char[] { '零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖' }; /** * 基本单位字符集合. */ private static char[] U = new char[] { '拾', '佰', '仟' }; /** * 特殊单位字符集合. */ private static char[] X = new char[] { '万', '亿', '兆' }; /** * * @param d * @return */ public static String toDaxie(double d) { if (d <= 0) return ""; if (d > Long.MAX_VALUE) throw new IllegalArgumentException("参数超出长整数的最大支持范围!"); String str = rawProcess(d); StringBuffer result = postProcess(d, str); fractionProcess(d, result); return result.toString(); } /** * 小数部分处理. * * @param d * @param result */ private static void fractionProcess(double d, StringBuffer result) { if (d % 1 > 0) {// 处理小数部分, 仅支持两位小数 int fraction = ((int) (d * 100)) % 100; if (fraction / 10 != 0) { result.append(N[fraction / 10] + "角"); } if (fraction % 10 != 0) { result.append(N[fraction % 10] + "分"); } } else {// 如果沒有小数, 尾部为'整' result.append("整"); } } /** * 后处理过程, 处理为惯用法. * * @param d * @param str * @return */ private static StringBuffer postProcess(double d, String str) { StringBuffer result = new StringBuffer(); char[] chars = str.toCharArray(); for (int i = 0; i < chars.length; i++) { char c = chars[i]; if (c == N[0]) {// 处理为惯用用法 if (i < chars.length - 1) { int ignoreType = 0; for (int j = 0; j < U.length; j++) {// 处理诸如'零仟', '零佰', // '零拾'等情况 if (chars[i + 1] == U[j]) { ignoreType = -1; break; } } for (int j = 0; j < X.length; j++) {// 处理诸如'零亿','零万'等情况 if (chars[i + 1] == X[j]) { ignoreType = 1; break; } } final int length = result.length(); switch (ignoreType) { case -1: // 保证不输出相邻重复的'零', 跳过'零'后的单位符号 i++; if (length > 0 && result.charAt(length - 1) != N[0]) result.append(N[0]); break; case 1: // 如果单位'万','亿','兆'前面出现'零',则删除'零' i++; if (length > 0 && result.charAt(length - 1) == N[0]) result.deleteCharAt(length - 1); char v = result.charAt(result.length() - 1); boolean append = true; for (int j = 0; j < X.length; j++) {// 处理诸如'亿万'的情况 if (v == X[j]) { append = false; break; } } if (append) result.append(chars[i]); break; } } } else { result.append(c); } } // 处理最后一个字符是'零'的情况 int len = result.length(); if (len > 0 && result.charAt(len - 1) == N[0]) { result.deleteCharAt(len - 1); } result.append('圆'); return result; } /** * * @param d * @return */ private static String rawProcess(double d) { StringBuffer buf = new StringBuffer(); long n = (long) d; int bit = 0; int x = 0; while (n > 0) { int m = (int) (n % 10);// 最低位数字 buf.append(N[m]); n = n / 10; if (n > 0) { int index = bit % 4; if (index == 3) buf.append(X[x++]); else buf.append(U[index]); } bit++; } return buf.reverse().toString(); }} 有人可以写个比较可靠的把中文数字转阿拉伯的么? 楼上的意思是把中文金额大写转换为阿拉伯数字吗?这个问题应该很简单的。字符“圆”把大写分为两个部分,即整数部分和小数部分(小数部分可能没有)。整数部分通过“兆”、“亿”、“万”等单位符号把中文金额分为若干个部分,每部分的数值范围是0-9999的中文大写。这部分的数字转换非常容易,然后把每部分的数值乘以相应的单位代表的数值(比如万代表10000),相加之后的结果即为整数部分的数据。小数部分一般只有两位,就不必说了吧。思路很简单,可能写程序的时候要注意一些细节问题。 接口Pattern.Status是做什么的? 【求】词法分析和语法分析的JAVA代码 java 编程生成代码 求助? 编码问题 请问如何发出一条Terminal(Mac机中命令行界面,linux命令行)指令,高手帮忙,100分! CLASSPATH怎么设置? java的反射问题,在线等待 谁能帮帮我啊!高分回报! ¥¥¥¥¥¥¥我的时间几乎都是在这打发的,感谢各位朋友!散分!!###### 数据库+锁+线程? 编写一段修改数据库的代码,但是提交完的数据后面好像有一些类似空格的东西。这是因为数据类型选择不合适吗,部分代码如下 做一个像土豆网的视频网站,用JAVA技术采用的架构
* @author Jason
*
*/
public class DaxieUtil {
/**
* 阿拉伯数字对应的汉字大写字符集合.
*/
private static char[] N = new char[] { '零', '壹', '贰', '叁', '肆', '伍', '陆',
'柒', '捌', '玖' }; /**
* 基本单位字符集合.
*/
private static char[] U = new char[] { '拾', '佰', '仟' }; /**
* 特殊单位字符集合.
*/
private static char[] X = new char[] { '万', '亿', '兆' }; /**
*
* @param d
* @return
*/
public static String toDaxie(double d) {
if (d <= 0)
return "";
if (d > Long.MAX_VALUE)
throw new IllegalArgumentException("参数超出长整数的最大支持范围!");
String str = rawProcess(d);
StringBuffer result = postProcess(d, str);
fractionProcess(d, result);
return result.toString();
} /**
* 小数部分处理.
*
* @param d
* @param result
*/
private static void fractionProcess(double d, StringBuffer result) {
if (d % 1 > 0) {// 处理小数部分, 仅支持两位小数
int fraction = ((int) (d * 100)) % 100;
if (fraction / 10 != 0) {
result.append(N[fraction / 10] + "角");
}
if (fraction % 10 != 0) {
result.append(N[fraction % 10] + "分");
}
} else {// 如果沒有小数, 尾部为'整'
result.append("整");
}
} /**
* 后处理过程, 处理为惯用法.
*
* @param d
* @param str
* @return
*/
private static StringBuffer postProcess(double d, String str) {
StringBuffer result = new StringBuffer();
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
char c = chars[i];
if (c == N[0]) {// 处理为惯用用法
if (i < chars.length - 1) {
int ignoreType = 0;
for (int j = 0; j < U.length; j++) {// 处理诸如'零仟', '零佰',
// '零拾'等情况
if (chars[i + 1] == U[j]) {
ignoreType = -1;
break;
}
}
for (int j = 0; j < X.length; j++) {// 处理诸如'零亿','零万'等情况
if (chars[i + 1] == X[j]) {
ignoreType = 1;
break;
}
}
final int length = result.length();
switch (ignoreType) {
case -1:
// 保证不输出相邻重复的'零', 跳过'零'后的单位符号
i++;
if (length > 0 && result.charAt(length - 1) != N[0])
result.append(N[0]);
break;
case 1:
// 如果单位'万','亿','兆'前面出现'零',则删除'零'
i++;
if (length > 0 && result.charAt(length - 1) == N[0])
result.deleteCharAt(length - 1);
char v = result.charAt(result.length() - 1);
boolean append = true;
for (int j = 0; j < X.length; j++) {// 处理诸如'亿万'的情况
if (v == X[j]) {
append = false;
break;
}
}
if (append)
result.append(chars[i]);
break;
}
}
} else {
result.append(c);
}
}
// 处理最后一个字符是'零'的情况
int len = result.length();
if (len > 0 && result.charAt(len - 1) == N[0]) {
result.deleteCharAt(len - 1);
}
result.append('圆');
return result;
} /**
*
* @param d
* @return
*/
private static String rawProcess(double d) {
StringBuffer buf = new StringBuffer();
long n = (long) d;
int bit = 0;
int x = 0;
while (n > 0) {
int m = (int) (n % 10);// 最低位数字
buf.append(N[m]);
n = n / 10;
if (n > 0) {
int index = bit % 4;
if (index == 3)
buf.append(X[x++]);
else
buf.append(U[index]);
}
bit++;
}
return buf.reverse().toString();
}}