Java.text包深度解析:格式化与国际化文本处理详解

2024-06-21 李腾 138 次阅读 0 次点赞
Java.text包是Java核心库中处理文本、日期、数字和消息的重要模块。本文全面解析该包的核心类和使用方法,通过详细的代码示例展示日期时间格式化、数字格式化、消息模板、字符串排序和文本边界分析等实用功能,帮助开发者快速掌握国际化应用的文本处理技术,提升开发效率和应用质量。

java.text 包提供了处理文本、日期、数字和消息的类和接口,用于实现与语言无关的文本处理功能。

主要类概览

1. 格式化类

1、DateFormat - 日期/时间格式化

2、NumberFormat - 数字格式化

3、MessageFormat - 消息格式化

4、SimpleDateFormat - 自定义日期格式

5、DecimalFormat - 自定义数字格式

2. 文本处理类

1、Collator - 字符串比较和排序

2、BreakIterator - 文本边界分析

示例代码

1. NumberFormat - 数字格式化

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

public class NumberFormatExample {
    public static void main(String[] args) {
        double number = 12345.6789;
        
        // 获取默认格式
        NumberFormat defaultFormat = NumberFormat.getInstance();
        System.out.println("默认格式: " + defaultFormat.format(number));
        
        // 获取货币格式
        NumberFormat currencyFormat = NumberFormat.getCurrencyInstance();
        System.out.println("货币格式: " + currencyFormat.format(number));
        
        // 获取百分比格式
        NumberFormat percentFormat = NumberFormat.getPercentInstance();
        percentFormat.setMinimumFractionDigits(2);
        System.out.println("百分比格式: " + percentFormat.format(0.8567));
        
        // 特定地区的格式
        NumberFormat frenchFormat = NumberFormat.getInstance(Locale.FRENCH);
        System.out.println("法语格式: " + frenchFormat.format(number));
        
        // 解析字符串为数字
        try {
            String numStr = "12,345.679";
            Number parsedNumber = defaultFormat.parse(numStr);
            System.out.println("解析结果: " + parsedNumber.doubleValue());
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

2. DateFormat - 日期格式化

import java.text.DateFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.Locale;

public class DateFormatExample {
    public static void main(String[] args) {
        Date now = new Date();
        
        // 不同风格的日期格式
        DateFormat shortFormat = DateFormat.getDateInstance(DateFormat.SHORT);
        DateFormat mediumFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
        DateFormat longFormat = DateFormat.getDateInstance(DateFormat.LONG);
        DateFormat fullFormat = DateFormat.getDateInstance(DateFormat.FULL);
        
        System.out.println("短格式: " + shortFormat.format(now));
        System.out.println("中格式: " + mediumFormat.format(now));
        System.out.println("长格式: " + longFormat.format(now));
        System.out.println("完整格式: " + fullFormat.format(now));
        
        // 日期时间格式
        DateFormat dateTimeFormat = DateFormat.getDateTimeInstance(
            DateFormat.MEDIUM, DateFormat.MEDIUM);
        System.out.println("日期时间: " + dateTimeFormat.format(now));
        
        // 特定地区的格式
        DateFormat chineseFormat = DateFormat.getDateInstance(DateFormat.FULL, Locale.CHINA);
        System.out.println("中文格式: " + chineseFormat.format(now));
        
        // 解析日期字符串
        try {
            String dateStr = "2023-12-25";
            DateFormat parser = DateFormat.getDateInstance();
            Date parsedDate = parser.parse(dateStr);
            System.out.println("解析的日期: " + parsedDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

3. SimpleDateFormat - 自定义日期格式

import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatExample {
    public static void main(String[] args) {
        Date now = new Date();
        
        // 自定义格式
        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println("格式1: " + sdf1.format(now));
        
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 EEEE");
        System.out.println("格式2: " + sdf2.format(now));
        
        SimpleDateFormat sdf3 = new SimpleDateFormat("hh:mm a");
        System.out.println("格式3: " + sdf3.format(now));
        
        SimpleDateFormat sdf4 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
        System.out.println("格式4: " + sdf4.format(now));
    }
}

4. DecimalFormat - 自定义数字格式

import java.text.DecimalFormat;

public class DecimalFormatExample {
    public static void main(String[] args) {
        double number = 1234.56789;
        
        // 各种数字格式模式
        DecimalFormat df1 = new DecimalFormat("#,##0.00");
        System.out.println("千分位: " + df1.format(number));
        
        DecimalFormat df2 = new DecimalFormat("00000.000");
        System.out.println("固定位数: " + df2.format(number));
        
        DecimalFormat df3 = new DecimalFormat("###,##0.###");
        System.out.println("灵活格式: " + df3.format(number));
        
        DecimalFormat df4 = new DecimalFormat("0.00E0");
        System.out.println("科学计数: " + df4.format(number));
        
        // 百分比格式
        DecimalFormat df5 = new DecimalFormat("0.00%");
        System.out.println("百分比: " + df5.format(0.8567));
        
        // 货币格式
        DecimalFormat df6 = new DecimalFormat("¤#,##0.00");
        System.out.println("货币: " + df6.format(number));
    }
}

5. MessageFormat - 消息格式化

import java.text.MessageFormat;
import java.util.Date;

public class MessageFormatExample {
    public static void main(String[] args) {
        // 基本消息格式化
        String pattern = "你好,{0}!今天是{1},你的账户余额是{2,number,currency}。";
        Object[] arguments = {"张三", new Date(), 12345.67};
        String message = MessageFormat.format(pattern, arguments);
        System.out.println(message);
        
        // 复杂格式
        pattern = "用户{0}在{1,date,long} {1,time,short}登录,这是第{2,number,integer}次登录。";
        Object[] args2 = {"李四", new Date(), 156};
        message = MessageFormat.format(pattern, args2);
        System.out.println(message);
        
        // 选择格式
        pattern = "有{0,choice,0#没有文件|1#1个文件|1<{0,number,integer}个文件}。";
        System.out.println(MessageFormat.format(pattern, 0));
        System.out.println(MessageFormat.format(pattern, 1));
        System.out.println(MessageFormat.format(pattern, 5));
    }
}

6. Collator - 字符串排序

import java.text.Collator;
import java.util.Arrays;
import java.util.Locale;

public class CollatorExample {
    public static void main(String[] args) {
        String[] names = {"张三", "李四", "王五", "赵六", "刘七"};
        
        // 使用中文排序规则
        Collator collator = Collator.getInstance(Locale.CHINA);
        
        System.out.println("排序前:");
        for (String name : names) {
            System.out.println(name);
        }
        
        Arrays.sort(names, collator);
        
        System.out.println("\n排序后:");
        for (String name : names) {
            System.out.println(name);
        }
        
        // 字符串比较
        String str1 = "北京";
        String str2 = "上海";
        int result = collator.compare(str1, str2);
        System.out.println("\n比较结果: " + str1 + " vs " + str2 + " = " + result);
    }
}

7. BreakIterator - 文本边界分析

import java.text.BreakIterator;
import java.util.Locale;

public class BreakIteratorExample {
    public static void main(String[] args) {
        String text = "这是一个示例文本。用于演示BreakIterator的功能。Hello World!";
        
        // 字符边界
        System.out.println("=== 字符边界 ===");
        BreakIterator charIterator = BreakIterator.getCharacterInstance(Locale.CHINA);
        charIterator.setText(text);
        int charStart = charIterator.first();
        while (charStart != BreakIterator.DONE) {
            int charEnd = charIterator.next();
            if (charEnd != BreakIterator.DONE) {
                System.out.println("字符: " + text.substring(charStart, charEnd));
                charStart = charEnd;
            } else {
                break;
            }
        }
        
        // 单词边界
        System.out.println("\n=== 单词边界 ===");
        BreakIterator wordIterator = BreakIterator.getWordInstance(Locale.CHINA);
        wordIterator.setText(text);
        int wordStart = wordIterator.first();
        while (wordStart != BreakIterator.DONE) {
            int wordEnd = wordIterator.next();
            if (wordEnd != BreakIterator.DONE) {
                String word = text.substring(wordStart, wordEnd);
                if (!word.trim().isEmpty()) {
                    System.out.println("单词: " + word);
                }
                wordStart = wordEnd;
            } else {
                break;
            }
        }
        
        // 句子边界
        System.out.println("\n=== 句子边界 ===");
        BreakIterator sentenceIterator = BreakIterator.getSentenceInstance(Locale.CHINA);
        sentenceIterator.setText(text);
        int sentenceStart = sentenceIterator.first();
        while (sentenceStart != BreakIterator.DONE) {
            int sentenceEnd = sentenceIterator.next();
            if (sentenceEnd != BreakIterator.DONE) {
                System.out.println("句子: " + text.substring(sentenceStart, sentenceEnd));
                sentenceStart = sentenceEnd;
            } else {
                break;
            }
        }
    }
}

总结

java.text 包提供了强大的文本处理能力,主要特点包括:

1、国际化支持 - 支持不同语言和地区的格式规则

2、格式化功能 - 数字、日期、消息的格式化和解析

3、文本分析 - 字符、单词、句子边界的识别

4、排序比较 - 基于特定语言的字符串排序

这些类在处理用户界面、数据展示、国际化应用等方面非常有用,能够帮助开发者创建更加用户友好的应用程序。

最后更新于3月前
本文由人工编写,AI优化,转载请注明原文地址: Java.text包完整使用指南:日期数字格式化与文本处理实战

评论 (1)

发表评论

昵称:加载中...
大雄David2025-11-13 18:22:59
很实用的Java.text包指南!示例代码对我处理数字格式化帮助很大,特别是多语言 locale 的部分。感谢作者的整理和分享!