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

Java字符解析:将货币缩写转换为全称的实现问题

没问题,我来帮你搞定这个货币解析的需求!要实现任意货币输入转全称的功能,核心是用映射关系来管理符号和全称的对应,这样扩展性拉满,以后加新货币单位直接改映射就行,不用动核心逻辑。

解决方案

核心思路

  1. 用一个Map存储货币符号到全称的对应关系,方便快速查找和扩展;
  2. 拆分每个token的数字部分和符号部分(支持多位数,比如29C);
  3. 从Map中获取符号对应的全称,拼接成最终字符串;
  4. 处理边界情况(比如未知符号),避免程序报错。

完整代码示例

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CurrencyParser {
    public void parseCurrency() {
        System.out.print('\u000c');
        String currencyIn = "3$ 29C 3P 1H";
        String[] tokens = currencyIn.split(" ");
        
        // 定义符号与全称的映射表,可随时添加新的货币单位
        Map<String, String> currencyMap = new HashMap<>();
        currencyMap.put("$", "dollars");
        currencyMap.put("C", "cents");
        currencyMap.put("P", "penny");
        currencyMap.put("H", "hpenny");
        
        StringBuilder resultBuilder = new StringBuilder();
        
        // 正则表达式:匹配数字组(\\d+)和非数字符号组(\\D+)
        Pattern tokenPattern = Pattern.compile("(\\d+)(\\D+)");
        
        for (String token : tokens) {
            Matcher matcher = tokenPattern.matcher(token);
            if (matcher.find()) {
                String quantity = matcher.group(1);
                String symbol = matcher.group(2);
                
                // 获取全称,未知符号直接保留原符号兜底
                String fullName = currencyMap.getOrDefault(symbol, symbol);
                
                // 拼接结果,自动添加空格
                resultBuilder.append(quantity)
                            .append(" ")
                            .append(fullName)
                            .append(" ");
            }
        }
        
        // 移除末尾多余空格后输出
        System.out.println(resultBuilder.toString().trim());
    }

    public static void main(String[] args) {
        new CurrencyParser().parseCurrency();
    }
}

代码解释

  • 映射表currencyMap:这是整个功能的核心,所有符号和全称的对应都存在这里。比如以后要加"Q"代表"quarters",直接加一行currencyMap.put("Q", "quarters");就行,完全不用改循环逻辑。
  • 正则拆分token:用(\\d+)(\\D+)可以精准拆分数字和符号,不管是"3$"还是"100X"都能正确提取数量和符号,比手动遍历字符简洁可靠。
  • 兜底处理:getOrDefault方法确保遇到未知符号时,不会抛出空指针,而是直接保留原符号,程序稳定性更高。
  • 高效拼接:用StringBuilder代替字符串拼接,避免创建大量临时字符串,性能更好。

扩展优化:处理复数形式

如果想要更贴合语法,比如"3 penny"改成"3 pennies",可以加一段复数判断逻辑:

// 在获取fullName之后添加这段代码
if (!quantity.equals("1")) {
    // 根据实际货币单位的复数规则调整,这里举几个例子
    switch (fullName) {
        case "penny":
            fullName = "pennies";
            break;
        case "hpenny":
            fullName = "hpennies";
            break;
        default:
            // 大部分单词直接加s
            if (!fullName.endsWith("s")) {
                fullName += "s";
            }
            break;
    }
}

这样运行后输出就会变成:3 dollars 29 cents 3 pennies 1 hpenny,更符合自然语言习惯。

内容的提问来源于stack exchange,提问作者Smurf1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:09:01