You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java解析特定格式货币输入并转换为长格式输出的技术问询

Java货币字符串解析程序完善方案

看起来你已经搭好了基础框架,接下来我们补上输入合法性校验的核心逻辑,同时优化格式转换的代码,让程序更健壮、完全符合需求。

需求回顾

用户输入格式为xD xC xP xH的字符串(x为非负整数),程序需要:

  1. 校验输入是否严格符合格式要求
  2. 将其转换为长格式输出: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:48:27