如何让Java数字转文字程序支持大于21.4亿的超大数值输入
问题背景
我正在开发一款将数字转换为对应英文单词格式的Java程序,最初实现的代码仅支持输入不超过int类型最大值(约21.4亿)的数字,计划升级支持更大数值。
补充说明:我已经将代码中所有int类型替换为long数据类型,成功将数值上限从21.4亿提升到了9990亿,但long类型的理论最大值是9京(9 quintillion),请问是什么原因导致无法达到理论上限?
现有代码
public class Converter { public static WordList wordFormat = new WordList(); public static final void converter(long value) { long valueSize = String.valueOf(value).length(); String[] output = new String[(int) valueSize]; long outputSize = output.length; long tracker = 1; long commasCTR = 0; long preValHolder = 0; // Returns "Zero" if value = 0 if (value == 0) { System.out.println("Zero"); return; }; // Self-made Conversion Method for (long valHolder = value, placeVal = 0; placeVal <= outputSize - 1; placeVal++, tracker++) { long remainder = valHolder % 10; long nextDigit = valHolder / 10 % 10; valHolder = valHolder / 10; // Num to Word Conditional Statements switch ((int) tracker) { case 1: if (placeVal == 0) { output[(int) placeVal] = WordList.wordFormat[0][(int) remainder]; // Ones } else { output[(int) placeVal] = WordList.wordFormat[0][(int) remainder].concat(" " + WordList.commas[(int) commasCTR]); // Commas commasCTR++; } break; case 2: if (remainder == 1) { // Teens output[(int) placeVal] = WordList.wordFormat[1][(int) preValHolder + 1]; if (placeVal < 3) output[(int) placeVal - 1] = " "; else output[(int) placeVal - 1] = WordList.commas[(int) commasCTR - 1]; } else if (placeVal > 3 && preValHolder == 0 && remainder == 0 && nextDigit == 0) { // Comma Zero Value Handler output[(int) placeVal - 1] = " "; output[(int) placeVal] = WordList.wordFormat[2][(int) remainder]; } else { output[(int) placeVal] = WordList.wordFormat[2][(int) remainder]; // Decades } break; case 3: output[(int) placeVal] = WordList.wordFormat[3][(int) remainder]; // Hundredths break; } // Re-assigning Values if (tracker == 3) tracker = 0; preValHolder = remainder; } for (long i = outputSize - 1; i >= 0; i--) { if (output[(int) i] == " ") continue; System.out.print(output[(int) i].trim() + " "); } return; } }
原因分析
- 核心问题是
WordList.commas单位数组长度不足。long类型最大值为9223372036854775807,共19位,每三位对应一个量级单位,依次需要千、百万、十亿、万亿、千万亿、百京共6个单位,你当前的commas数组仅定义到千亿对应的单位,当数值超过999999999999(12位,即1万亿)时,commasCTR自增后会超出数组索引范围,触发数组越界异常,导致无法处理更大的数值。 - 代码中存在多处long转int的强转操作,虽然long最大值的位数仅19位,现阶段不会触发int溢出,但如果后续要支持超过int数组长度上限的超大数值(比如BigInteger类型),这部分逻辑也需要调整。
修复方案
- 补充
WordList.commas数组的单位,按顺序添加trillion(万亿)、quadrillion(千万亿)、quintillion(百京),保证数组长度至少为6,覆盖long最大值对应的所有量级。 - 增加边界校验逻辑,在访问
WordList.commas前先判断commasCTR是否小于数组长度,避免异常。 - 如果后续需要支持比long更大的数值,可以将入参改为
BigInteger类型,同步调整数值处理逻辑即可。
内容的提问来源于stack exchange,提问作者Francis
相关产品推荐
相关产品推荐

