Java解析特定格式货币输入并转换为长格式输出的技术问询
Java货币字符串解析程序完善方案
看起来你已经搭好了基础框架,接下来我们补上输入合法性校验的核心逻辑,同时优化格式转换的代码,让程序更健壮、完全符合需求。
需求回顾
用户输入格式为xD xC xP xH的字符串(x为非负整数),程序需要:
- 校验输入是否严格符合格式要求
- 将其转换为长格式输出:
x Dollars, x Cents, x Penny's, x half penny's
完整实现代码
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CurrencyParser { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入货币字符串(格式:xD xC xP xH):"); String currencyIn = scanner.nextLine().trim(); // 第一步:输入合法性校验 // 正则规则:固定4个部分,每个部分是「非负整数+指定后缀」,用空格分隔 String validPattern = "^\\d+D \\d+C \\d+P \\d+H$"; Pattern pattern = Pattern.compile(validPattern); Matcher matcher = pattern.matcher(currencyIn); if (!matcher.matches()) { System.out.println("❌ 输入格式不合法!请严格遵循「xD xC xP xH」格式,其中x为非负整数。"); scanner.close(); return; } // 第二步:分割字符串并转换为长格式 String[] tokens = currencyIn.split(" "); StringBuilder resultBuilder = new StringBuilder(); for (int i = 0; i < tokens.length; i++) { String token = tokens[i]; // 提取数字部分和后缀字符 String numStr = token.substring(0, token.length() - 1); char suffix = token.charAt(token.length() - 1); // 根据后缀拼接长格式文本 switch (suffix) { case 'D': resultBuilder.append(numStr).append(" Dollars"); break; case 'C': resultBuilder.append(numStr).append(" Cents"); break; case 'P': resultBuilder.append(numStr).append(" Penny's"); break; case 'H': resultBuilder.append(numStr).append(" half penny's"); break; default: // 理论上不会走到这里,因为正则已经校验过后缀合法性 resultBuilder.append(token); } // 添加逗号分隔符(最后一个元素不加) if (i != tokens.length - 1) { resultBuilder.append(", "); } } // 输出最终结果 System.out.println("✅ 转换结果:" + resultBuilder.toString()); scanner.close(); } }
关键细节说明
1. 输入校验逻辑
我们用正则表达式^\\d+D \\d+C \\d+P \\d+H$做严格校验:
^和$确保整个字符串完全匹配,避免输入多余字符\\d+匹配1个或多个数字(保证是合法非负整数)- 明确限定后缀只能是
D/C/P/H,且四个部分顺序固定
2. 格式转换逻辑
- 通过
split(" ")将输入字符串分割为独立的货币单元 - 对每个单元,截取数字部分和后缀字符,用
switch分支映射到长格式名称 - 使用
StringBuilder拼接结果,比直接字符串拼接更高效
3. 异常处理
如果输入格式不符合要求,程序会直接提示错误并终止,避免后续逻辑出现不必要的异常。
可选优化点
如果你想让程序更严谨,可以额外添加:
- 数字部分的整数有效性校验(虽然正则已经限制
\\d+,但可以用Integer.parseInt()配合try-catch处理超大数字的情况) - 单复数优化:比如
1 Penny而不是1 Penny's,可以根据数字值判断是否调整后缀
内容的提问来源于stack exchange,提问作者kp-a
相关产品推荐
相关产品推荐

