数字转汉字问题 任意一个正整数,请问怎么将其转换为数字? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 数字转汉字?第一次听说是不是unicode码? 是一二三四这样的汉字吗,java大概没有提供这样的功能,只有自己写一个mapping的函数了。 不知道,最多是通过数字找英文字母!java里面没有直接可以匹配汉字的功能! 分析一下:先看下面的数字对应关系1 2 3 4 5 6 7 8 9,翻译过来是一亿二千三百四十五万六千七百八十九仔细看一下,其中的 十百千万亿 是位数词,其中亿下面包含的最高数字单位是万万下面包含的最高数字单位是千千下面包含的最高数字单位是百百下面包含的最高数字单位是十十下面只有数字因此可以将数字按照最高的单位拆分成左右两部分,然后对每个部分求出它们的结果,最后加上位数词拼接起来。例如s = 123456789其最高的单位是“亿”,于是按照“亿”这一级进行拆分假设说映射函数为f,f(s)= f(1)+"亿"+f(23456789)对于23456789,最高的单位是“万”,于是按照“万”这一级进行拆分...最后的结果如下所示 f(123456789)= f(1)亿 f(23456789) = f(1)亿 f(2345)万 f(6789) = f(1)亿 f(2)千 +f(345)万 f(6)千 f(789) = f(1)亿 f(2)千 f(3)百 f(45)万 f(6)千 f(7)百 f(89) = f(1)亿 f(2)千 f(3)百 f(4)十 f(5)万 f(6)千 f(7)百 f(8)十 f(9)用这样的方法,理论上可以表达出任意大的正整数,例如如果汉字中没有“亿”这一级单位的话上面的方法得出的结果可以是 一万二千三百四十五万六千七百八十九。当然还有一些东西需要处理,例如1002应转换为 一千零二 而不是 一千零百零十二,12应转换为 十二 而不是 一十二... yyfhz(火山) 说的没错,关键是特殊情况的处理。 看这里: http://www.blogjava.net/rickhunter/articles/26849.html里面有这道题的答案: 将一个键盘输入的数字转化成中文输出(例如:输入:1234567 输出:一百二拾三万四千五百六拾七)用java语言实现,,请编一段程序实现! 特殊情况就是yyfhz(火山)最后三行说的。谢谢楼上的! 看看这个类,是我们用过的,基本还可以吧!import java.text.NumberFormat;import java.util.HashMap;import java.util.Locale;/** * 中文大写转换 * * * 将数据按照国人习惯的大写方式表达 */public class NumberChineseFormat { /** * 进制单位名称 */ private static HashMap DAN_WEI; /** * 中文数字表示 */ private static HashMap CHINESE_NUMBER; /** * 每四位的单位名称(汉语特有的方式,英文为每三位) */ private static HashMap FOUR_DAN_WEI; /** * 零 */ private static String ZERO = "零"; static { DAN_WEI = new HashMap(); DAN_WEI.put("-2", "分"); DAN_WEI.put("-1", "角"); DAN_WEI.put("1", ""); DAN_WEI.put("2", "拾"); DAN_WEI.put("3", "佰"); DAN_WEI.put("4", "千"); CHINESE_NUMBER = new HashMap(); CHINESE_NUMBER.put("0", "零"); CHINESE_NUMBER.put("1", "壹"); CHINESE_NUMBER.put("2", "贰"); CHINESE_NUMBER.put("3", "叁"); CHINESE_NUMBER.put("4", "肆"); CHINESE_NUMBER.put("5", "伍"); CHINESE_NUMBER.put("6", "陆"); CHINESE_NUMBER.put("7", "柒"); CHINESE_NUMBER.put("8", "捌"); CHINESE_NUMBER.put("9", "玖"); FOUR_DAN_WEI = new HashMap(); FOUR_DAN_WEI.put("0", "元"); FOUR_DAN_WEI.put("1", "万"); FOUR_DAN_WEI.put("2", "亿"); FOUR_DAN_WEI.put("3", "兆"); } private double number; private String currency; private String integer; private String fraction; /** * 构造方法 * * @param number * 要转换的数据 */ public NumberChineseFormat(double number) { NumberFormat nf; nf = NumberFormat.getCurrencyInstance(Locale.CHINA); this.number = number; this.currency = nf.format(number); this.integer = "" + (long) number; this.fraction = currency.substring(currency.length() - 2); } /** * 格式化 * * @return 中文大写 */ public String format() { if (this.number == 0) return "零元"; else return this.formatInteger() + this.formatFraction(); } /** * 转为中文大写 为转换整数和分数部分提供服务 * * @param str * 要转换的数据 * @return 中文大写 */ private String toChinese(String str) { String cn = ""; while (str.length() > 0) { if (str.charAt(0) != '0') { cn += (String) CHINESE_NUMBER .get(String.valueOf(str.charAt(0))); cn += (String) DAN_WEI.get(String.valueOf(str.length())); } else { cn += (String) CHINESE_NUMBER.get("0"); } str = str.substring(1); } while (cn.indexOf(ZERO + ZERO) >= 0) cn = cn.replaceAll(ZERO + ZERO, ZERO); if (cn.endsWith(ZERO)) cn = cn.substring(0, cn.length() - 1); return cn; } /** * 转换整数部分 * * @return 整数部分的中文大写 */ private String formatInteger() { String cn = ""; String str; String[] strArry; int c; strArry = new String[integer.length() / 4 + 1]; int j = 0; while (integer.length() >= 4) { str = integer.substring(integer.length() - 4); System.out.println("$" + this.integer + "$"); integer = integer.substring(0, integer.length() - 4); strArry[j] = str; j++; } if (!integer.equals("")) { strArry[strArry.length - 1] = integer; c = strArry.length; } else { c = strArry.length - 1; } for (int i = c - 1; i >= 0; i--) { cn += this.toChinese(strArry[i]); cn += (String) FOUR_DAN_WEI.get("" + i); } if (this.integer.equals("")) this.integer = "-1"; if (Integer.parseInt(this.integer) != 0) return cn; else return ""; } /** * 转换分数部分 * * @return 分数部分的中文大写 */ private String formatFraction() { String cn = ""; if (this.fraction.equals("")) this.fraction = "-1"; if (this.integer.equals("")) this.integer = "-1"; if (Integer.parseInt(this.fraction) == 0) { return "整"; } if (this.fraction.charAt(0) != '0') { cn += (String) CHINESE_NUMBER.get(String .valueOf(fraction.charAt(0))); cn += (String) DAN_WEI.get("-1"); } else { if (Integer.parseInt(this.integer) != 0) cn += ZERO; } if (this.fraction.charAt(1) != '0') { cn += (String) CHINESE_NUMBER.get(String .valueOf(fraction.charAt(1))); cn += (String) DAN_WEI.get("-2"); } return cn; }} 谢谢p_p_y(心若虚尘)!你发帖的时候我已经给完分了,实在不好意思! GUI,书上的例子 线程之间合作的问题(低手高手都帮帮忙吧) 空指针问题,希望大家帮帮我。谢谢了。 java 小问题 java初学者求助………… 问个很棘手的问题 请问高手这个用java语言怎么实现? 用java怎样获取当前程序路径啊??? 急!!!如何使用Broland Enterprise Server开发分布式应用程序 一个dll文件,用那个编译器能看到源代码?! 有关swing 谁碰到过这个问题 , 快来 帮忙解决下
是不是unicode码?
java里面没有直接可以匹配汉字的功能!
先看下面的数字对应关系
1 2 3 4 5 6 7 8 9,翻译过来是
一亿二千三百四十五万六千七百八十九
仔细看一下,其中的 十百千万亿 是位数词,其中
亿下面包含的最高数字单位是万
万下面包含的最高数字单位是千
千下面包含的最高数字单位是百
百下面包含的最高数字单位是十
十下面只有数字
因此可以将数字按照最高的单位拆分成左右两部分,然后对每个部分求出它们的结果,最后加上位数词拼接起来。
例如s = 123456789
其最高的单位是“亿”,于是按照“亿”这一级进行拆分
假设说映射函数为f,
f(s)= f(1)+"亿"+f(23456789)
对于23456789,最高的单位是“万”,于是按照“万”这一级进行拆分...
最后的结果如下所示
f(123456789)=
f(1)亿 f(23456789) =
f(1)亿 f(2345)万 f(6789) =
f(1)亿 f(2)千 +f(345)万 f(6)千 f(789) =
f(1)亿 f(2)千 f(3)百 f(45)万 f(6)千 f(7)百 f(89) =
f(1)亿 f(2)千 f(3)百 f(4)十 f(5)万 f(6)千 f(7)百 f(8)十 f(9)
用这样的方法,理论上可以表达出任意大的正整数,例如如果汉字中没有“亿”这一级单位的话
上面的方法得出的结果可以是 一万二千三百四十五万六千七百八十九。
当然还有一些东西需要处理,例如
1002应转换为 一千零二 而不是 一千零百零十二,
12应转换为 十二 而不是 一十二...
http://www.blogjava.net/rickhunter/articles/26849.html里面有这道题的答案:
将一个键盘输入的数字转化成中文输出
(例如:输入:1234567 输出:一百二拾三万四千五百六拾七)
用java语言实现,,请编一段程序实现!
import java.util.HashMap;
import java.util.Locale;/**
* 中文大写转换
*
*
* 将数据按照国人习惯的大写方式表达
*/
public class NumberChineseFormat { /**
* 进制单位名称
*/
private static HashMap DAN_WEI; /**
* 中文数字表示
*/
private static HashMap CHINESE_NUMBER; /**
* 每四位的单位名称(汉语特有的方式,英文为每三位)
*/
private static HashMap FOUR_DAN_WEI; /**
* 零
*/
private static String ZERO = "零"; static {
DAN_WEI = new HashMap();
DAN_WEI.put("-2", "分");
DAN_WEI.put("-1", "角");
DAN_WEI.put("1", "");
DAN_WEI.put("2", "拾");
DAN_WEI.put("3", "佰");
DAN_WEI.put("4", "千"); CHINESE_NUMBER = new HashMap();
CHINESE_NUMBER.put("0", "零");
CHINESE_NUMBER.put("1", "壹");
CHINESE_NUMBER.put("2", "贰");
CHINESE_NUMBER.put("3", "叁");
CHINESE_NUMBER.put("4", "肆");
CHINESE_NUMBER.put("5", "伍");
CHINESE_NUMBER.put("6", "陆");
CHINESE_NUMBER.put("7", "柒");
CHINESE_NUMBER.put("8", "捌");
CHINESE_NUMBER.put("9", "玖"); FOUR_DAN_WEI = new HashMap();
FOUR_DAN_WEI.put("0", "元");
FOUR_DAN_WEI.put("1", "万");
FOUR_DAN_WEI.put("2", "亿");
FOUR_DAN_WEI.put("3", "兆");
} private double number; private String currency; private String integer; private String fraction; /**
* 构造方法
*
* @param number
* 要转换的数据
*/
public NumberChineseFormat(double number) { NumberFormat nf;
nf = NumberFormat.getCurrencyInstance(Locale.CHINA); this.number = number;
this.currency = nf.format(number);
this.integer = "" + (long) number;
this.fraction = currency.substring(currency.length() - 2);
} /**
* 格式化
*
* @return 中文大写
*/
public String format() { if (this.number == 0)
return "零元";
else
return this.formatInteger() + this.formatFraction();
} /**
* 转为中文大写 为转换整数和分数部分提供服务
*
* @param str
* 要转换的数据
* @return 中文大写
*/
private String toChinese(String str) { String cn = ""; while (str.length() > 0) { if (str.charAt(0) != '0') {
cn += (String) CHINESE_NUMBER
.get(String.valueOf(str.charAt(0)));
cn += (String) DAN_WEI.get(String.valueOf(str.length()));
} else {
cn += (String) CHINESE_NUMBER.get("0");
}
str = str.substring(1);
} while (cn.indexOf(ZERO + ZERO) >= 0)
cn = cn.replaceAll(ZERO + ZERO, ZERO); if (cn.endsWith(ZERO))
cn = cn.substring(0, cn.length() - 1); return cn;
} /**
* 转换整数部分
*
* @return 整数部分的中文大写
*/
private String formatInteger() {
String cn = "";
String str;
String[] strArry;
int c; strArry = new String[integer.length() / 4 + 1]; int j = 0;
while (integer.length() >= 4) { str = integer.substring(integer.length() - 4); System.out.println("$" + this.integer + "$"); integer = integer.substring(0, integer.length() - 4); strArry[j] = str; j++;
} if (!integer.equals("")) {
strArry[strArry.length - 1] = integer;
c = strArry.length;
} else {
c = strArry.length - 1;
} for (int i = c - 1; i >= 0; i--) {
cn += this.toChinese(strArry[i]);
cn += (String) FOUR_DAN_WEI.get("" + i);
} if (this.integer.equals(""))
this.integer = "-1"; if (Integer.parseInt(this.integer) != 0)
return cn;
else
return "";
} /**
* 转换分数部分
*
* @return 分数部分的中文大写
*/
private String formatFraction() { String cn = ""; if (this.fraction.equals(""))
this.fraction = "-1"; if (this.integer.equals(""))
this.integer = "-1"; if (Integer.parseInt(this.fraction) == 0) {
return "整";
} if (this.fraction.charAt(0) != '0') {
cn += (String) CHINESE_NUMBER.get(String
.valueOf(fraction.charAt(0))); cn += (String) DAN_WEI.get("-1");
} else { if (Integer.parseInt(this.integer) != 0)
cn += ZERO;
} if (this.fraction.charAt(1) != '0') {
cn += (String) CHINESE_NUMBER.get(String
.valueOf(fraction.charAt(1))); cn += (String) DAN_WEI.get("-2");
} return cn;
}
}