java 数字转英文

package com.ls.it.day4;


public class NumberParser {


public static void main(String[] args) {

System.out.println( NumberParser.parse("123456789"));

}


public static String parse(String x) {

int z = x.indexOf("."); // 取小数点位置

String lstr = "", rstr = "";

if (z > -1) { // 看是否有小数,如果有,则分别取左边和右边

lstr = x.substring(0, z);

rstr = x.substring(z + 1);

} else // 否则就是全部

lstr = x;


String lstrrev = reverse(lstr); // 对左边的字串取反

String[] a = new String[5]; // 定义5个字串变量来存放解析出来的叁位一组的字串


switch (lstrrev.length() % 3) {

case 1 :

lstrrev += "00";

break;

case 2 :

lstrrev += "0";

break;

}

String lm = ""; // 用来存放转换後的整数部分

for (int i = 0; i < lstrrev.length() / 3; i++) {

a[i] = reverse(lstrrev.substring(3 * i, 3 * i + 3)); // 截取第一个叁位

if (!a[i].equals("000")) { // 用来避免这种情况:1000000 = one million thousand only

if (i != 0)

lm = transThree(a[i]) + " " + parseMore(String.valueOf(i)) + " " + lm; // 加: thousand、million、billion

else

lm = transThree(a[i]); // 防止i=0时, 在多加两个空格.

} else

lm += transThree(a[i]);

}


String xs = ""; // 用来存放转换後小数部分

if (z > -1)

xs = "AND CENTS " + transTwo(rstr) + " "; // 小数部分存在时转换小数


//return lm.trim() + " " + xs + "ONLY";

return lm.trim() + " " + xs ;

}


private static String parseFirst(String s) {

String[] a =

new String[] { "", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE" };

return a[Integer.parseInt(s.substring(s.length() - 1))];

}


private static String parseTeen(String s) {

String[] a =

new String[] {

"TEN",

"ELEVEN",

"TWELEVE",

"THIRTEEN",

"FOURTEEN",

"FIFTEEN",

"SIXTEEN",

"SEVENTEEN",

"EIGHTEEN",

"NINETEEN" };

return a[Integer.parseInt(s) - 10];

}


private static String parseTen(String s) {

String[] a =

new String[] {

"TEN",

"TWENTY",

"THIRTY",

"FORTY",

"FIFTY",

"SIXTY",

"SEVENTY",

"EIGHTY",

"NINETY" };

return a[Integer.parseInt(s.substring(0, 1)) - 1];

}


// 两位

private static String transTwo(String s) {

String value = "";

// 判断位数

if (s.length() > 2)

s = s.substring(0, 2);

else if (s.length() < 2)

s = "0" + s;


if (s.startsWith("0")) // 07 - seven 是否小於10

value = parseFirst(s);

else if (s.startsWith("1")) // 17 seventeen 是否在10和20之间

value = parseTeen(s);

else if (s.endsWith("0")) // 是否在10与100之间的能被10整除的数

value = parseTen(s);

else

value = parseTen(s) + " " + parseFirst(s);

return value;

}


private static String parseMore(String s) {

String[] a = new String[] { "", "THOUSAND", "MILLION", "BILLION" };

return a[Integer.parseInt(s)];

}


// 制作叁位的数

// s.length = 3

private static String transThree(String s) {

String value = "";

if (s.startsWith("0")) // 是否小於100

value = transTwo(s.substring(1));

else if (s.substring(1).equals("00")) // 是否被100整除

value = parseFirst(s.substring(0, 1)) + " HUNDRED";

else

value = parseFirst(s.substring(0, 1)) + " HUNDRED AND " + transTwo(s.substring(1));

return value;

}


private static String reverse(String s) {

char[] aChr = s.toCharArray();

StringBuffer tmp = new StringBuffer();

for (int i = aChr.length - 1; i >= 0; i--) {

tmp.append(aChr[i]);

}

return tmp.toString();

}

}

<think>嗯,用户想知道在Java中如何将数字换成英文单词。我需要先回忆一下相关的算法和实现方法。记得以前处理过类似的问题,比如LeetCode上的整数英文单词题目。这类问题的关键在于将数字分段处理,通常是每三位一组,比如千、百万、十亿等,然后对每一组进行换,再加上对应的单位。 首先,我需要确定如何将三位数换为英文单词。例如,数字123会被分解成1(百位)、2(十位)、3(个位)。处理的时候要注意十位和个位的组合,比如11到19需要特殊处理,还有各个位的单位,如“Hundred”。然后,每一组处理完之后,需要加上对应的千分位单位,比如Thousand、Million、Billion。 接下来,用户可能遇到哪些边界情况呢?比如输入为0的情况,直接返回“Zero”。中间有零的情况,比如1000010,中间的三个零可能不需要处理,但需要确保不会输出多余的空格或单位。此外,数字范围可能有限制,比如Java中的整数最大到20亿左右,所以需要考虑处理到十亿级别。 然后,参考已有的解决方案,比如C#和C的实现,可以借鉴分块的思路。将数字分成四个部分:Billion、Million、Thousand,以及剩下的三位数。每个部分调用同一个换函数,处理三位数,然后加上对应的单位。 在Java中实现的话,可能需要使用数组或哈希表来存储数字对应英文单词,比如0-19,以及几十的倍数(Twenty, Thirty等)。然后,编写递归或循环来处理每一组三位数。 还要注意字符串拼接时的空格处理,避免出现多余的空格。例如,处理完百位后,如果十位或个位存在,需要添加空格。此外,处理零的时候,比如中间的零是否需要跳过,比如1000应该是“One Thousand”而不是“One Thousand Zero”。 测试用例也很重要,比如测试0、1000、12345、1000010等边界情况,确保程序能够正确处理。 最后,可能需要考虑性能优化,比如使用StringBuilder来拼接字符串,避免频繁的字符串拼接操作,提高效率。另外,确保代码结构清晰,将三位数的换和主函数分离开,提高可读性。 总结一下,步骤大概是:处理0的情况,分块处理Billion、Million、Thousand,每个块换为三位数的英文,加上单位,最后组合起来。注意处理各个位的特殊情况和空格管理。</think>将数字换为英文表示需要处理数位拆分、特殊词汇映射和单位组合。以下是Java实现方案: ### 分步实现方法 1. **定义基础词汇映射** ```java private static final String[] LESS_THAN_20 = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"}; private static final String[] TENS = {"", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"}; private static final String[] THOUSANDS = {"", "Thousand", "Million", "Billion"}; ``` 2. **递归处理三位数** ```java private static String helper(int num) { if (num == 0) return ""; if (num < 20) { return LESS_THAN_20[num] + " "; } else if (num < 100) { return TENS[num / 10] + " " + helper(num % 10); } else { return LESS_THAN_20[num / 100] + " Hundred " + helper(num % 100); } } ``` 3. **主换函数** ```java public static String numberToWords(int num) { if (num == 0) return "Zero"; int i = 0; String words = ""; while (num > 0) { if (num % 1000 != 0) { words = helper(num % 1000) + THOUSANDS[i] + " " + words; } num /= 1000; i++; } return words.trim().replaceAll(" +", " "); } ``` ### 测试用例验证 1. **输入0**:返回"Zero" 2. **输入123**:输出"One Hundred Twenty Three" 3. **输入1,234,567**:输出"One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven" 4. **输入1,000,010**:输出"One Million Ten"(正确处理中间零值)[^2] ### 优化建议 - 使用`StringBuilder`替代字符串拼接提升性能 - 预先生成所有三位数组合的映射表(空间换时间) - 添加输入范围校验(支持0到2,147,483,647)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值