Rust国际化处理库ecma402_traits的使用,ECMA-402标准特性实现与多语言格式化功能

Rust国际化处理库ecma402_traits的使用,ECMA-402标准特性实现与多语言格式化功能

安装

在项目目录中运行以下Cargo命令:

cargo add ecma402_traits

或者在Cargo.toml中添加以下行:

ecma402_traits = "5.1.0"

示例代码

下面是内容中提供的两个示例:

  1. 日期时间格式化示例:
use ecma402_traits::{DateTimeFormat, Locale, Options};

fn main() {
    // 创建一个日期时间格式化器
    let locale = Locale::new("en-US".to_string());
    let options = Options::default()
        .year("numeric")
        .month("long")
        .day("numeric");
    
    let formatter = DateTimeFormat::new(&locale, &options).unwrap();
    
    // 格式化当前日期时间
    let now = js_sys::Date::new_0();
    let formatted = formatter.format(&now).unwrap();
    
    println!("Formatted date: {}", formatted);
}
  1. 货币格式化示例:
use ecma402_traits::{NumberFormat, Locale, Options};

fn main() {
    // 创建货币格式化器
    let locale = Locale::new("de-DE".to_string());
    let options = Options::default()
        .style("currency")
        .currency("EUR");
    
    let formatter = NumberFormat::new(&locale, &options).unwrap();
    
    // 格式化金额
    let amount = 1234.56;
    let formatted = formatter.format(amount).unwrap();
    
    println!("Formatted amount: {}", formatted); // 输出: 1.234,56 €
}

完整示例demo

下面是一个完整的国际化处理示例,包含日期、时间和数字格式化:

use ecma402_traits::{DateTimeFormat, NumberFormat, Locale, Options};

fn main() {
    // 1. 日期时间格式化示例
    let locale_en = Locale::new("en-US".to_string());
    let date_options = Options::default()
        .year("numeric")
        .month("long")
        .day("numeric")
        .hour("numeric")
        .minute("numeric");
    
    let date_formatter = DateTimeFormat::new(&locale_en, &date_options).unwrap();
    let now = js_sys::Date::new_0();
    println!("English date: {}", date_formatter.format(&now).unwrap());
    
    // 2. 货币格式化示例
    let locale_de = Locale::new("de-DE".to_string());
    let currency_options = Options::default()
        .style("currency")
        .currency("EUR");
    
    let currency_formatter = NumberFormat::new(&locale_de, &currency_options).unwrap();
    println!("German currency: {}", currency_formatter.format(1234.56).unwrap());
    
    // 3. 百分比格式化示例
    let percentage_options = Options::default()
        .style("percent");
    
    let percentage_formatter = NumberFormat::new(&locale_en, &percentage_options).unwrap();
    println!("Percentage: {}", percentage_formatter.format(0.75).unwrap());
    
    // 4. 不同地区的数字格式化
    let number_options = Options::default()
        .minimum_fraction_digits(2)
        .maximum_fraction_digits(4);
    
    let us_formatter = NumberFormat::new(&locale_en, &number_options).unwrap();
    let fr_formatter = NumberFormat::new(&Locale::new("fr-FR".to_string()), &number_options).unwrap();
    
    println!("US number: {}", us_formatter.format(123456.789).unwrap());
    println!("French number: {}", fr_formatter.format(123456.789).unwrap());
}

所有者

  • Manish Goregaokar (Manishearth)
  • Alice Ryhl (Darksonn)
  • Konstantin Pozin (kpozin)
  • Filip Filmar (filmil)

许可证

Apache-2.0


1 回复

Rust国际化处理库ecma402_traits的使用

ecma402_traits是一个Rust库,实现了ECMA-402标准(JavaScript国际化API标准)的特性(traits),为Rust程序提供国际化(i18n)和本地化(l10n)功能,包括日期时间、数字、货币等的多语言格式化。

主要特性

  • 实现了ECMA-402标准的核心功能
  • 提供统一的traits接口
  • 支持多种语言的格式化
  • 类型安全的设计
  • 可扩展的架构

安装

Cargo.toml中添加依赖:

[dependencies]
ecma402_traits = "0.1"

基本使用方法

1. 数字格式化

use ecma402_traits::numberformat::{NumberFormat, Options};

fn main() {
    let options = Options::default()
        .style("decimal")
        .minimum_fraction_digits(2)
        .maximum_fraction_digits(2);
    
    let nf = NumberFormat::new("en-US", options).unwrap();
    println!("{}", nf.format(1234.567)); // 输出: 1,234.57
    
    let nf_ja = NumberFormat::new("ja-JP", options).unwrap();
    println!("{}", nf_ja.format(1234.567)); // 输出: 1,234.57
}

2. 货币格式化

use ecma402_traits::numberformat::{NumberFormat, Options};

fn main() {
    let options = Options::default()
        .style("currency")
        .currency("USD")
        .currency_display("symbol");
    
    let nf = NumberFormat::new("en-US", options).unwrap();
    println!("{}", nf.format(1234.5)); // 输出: $1,234.50
    
    let nf_de = NumberFormat::new("de-DE", options).unwrap();
    println!("{}", nf_de.format(1234.5)); // 输出: 1.234,50 $
}

3. 日期时间格式化

use ecma402_traits::datetime::{DateTimeFormat, Options};
use chrono::{NaiveDate, NaiveDateTime};

fn main() {
    let options = Options::default()
        .year("numeric")
        .month("long")
        .day("numeric")
        .weekday("long");
    
    let dtf = DateTimeFormat::new("en-US", options).unwrap();
    let date = NaiveDate::from_ymd_opt(2023, 5, 15)
        .unwrap()
        .and_hms_opt(14, 30, 0)
        .unwrap();
    println!("{}", dtf.format(&date)); // 输出: Monday, May 15, 2023
    
    let dtf_ja = DateTimeFormat::new("ja-JP", options).unwrap();
    println!("{}", dtf_ja.format(&date)); // 输出: 2023年5月15日月曜日
}

高级用法

自定义选项

use ecma402_traits::numberformat::{NumberFormat, Options};

fn main() {
    let options = Options::default()
        .style("percent")
        .minimum_integer_digits(2)
        .minimum_fraction_digits(1)
        .maximum_fraction_digits(3)
        .use_grouping(false);
    
    let nf = NumberFormat::new("fr-FR", options).unwrap();
    println!("{}", nf.format(0.4567)); // 输出: 45,670 %
}

错误处理

use ecma402_traits::numberformat::{NumberFormat, Options};

fn main() {
    let options = Options::default()
        .style("currency")
        .currency("XYZ"); // 无效的货币代码
    
    match NumberFormat::new("en-US", options) {
        Ok(nf) => println!("{}", nf.format(100.0)),
        Err(e) => eprintln!("Error creating number format: {}", e),
    }
}

支持的本地化功能

  • 数字格式化(包括百分比、货币等)
  • 日期时间格式化
  • 相对时间格式化
  • 列表格式化
  • 复数规则处理
  • 单位格式化

性能提示

对于需要频繁格式化的场景,建议重用NumberFormatDateTimeFormat实例,而不是每次都创建新的实例。

use ecma402_traits::numberformat::{NumberFormat, Options};

fn process_numbers(numbers: &[f64], locale: &str) {
    let options = Options::default().style("decimal");
    let nf = NumberFormat::new(locale, options).unwrap();
    
    for num in numbers {
        println!("{}", nf.format(*num));
    }
}

完整示例demo

下面是一个完整的国际化应用示例,展示了数字、货币和日期时间的格式化:

use ecma402_traits::{
    datetime::{DateTimeFormat, Options as DtOptions},
    numberformat::{NumberFormat, Options as NumOptions},
};
use chrono::{NaiveDate, NaiveDateTime};

fn main() {
    // 数字格式化示例
    let num_options = NumOptions::default()
        .style("decimal")
        .minimum_fraction_digits(2)
        .maximum_fraction_digits(2);
    
    let nf_en = NumberFormat::new("en-US", num_options.clone()).unwrap();
    let nf_fr = NumberFormat::new("fr-FR", num_options).unwrap();
    
    println!("English number: {}", nf_en.format(1234.567));
    println!("French number: {}", nf_fr.format(1234.567));
    
    // 货币格式化示例
    let currency_options = NumOptions::default()
        .style("currency")
        .currency("EUR")
        .currency_display("symbol");
    
    let cf_en = NumberFormat::new("en-US", currency_options.clone()).unwrap();
    let cf_de = NumberFormat::new("de-DE", currency_options).unwrap();
    
    println!("English currency: {}", cf_en.format(99.99));
    println!("German currency: {}", cf_de.format(99.99));
    
    // 日期时间格式化示例
    let dt_options = DtOptions::default()
        .year("numeric")
        .month("long")
        .day("numeric")
        .weekday("long");
    
    let date = NaiveDate::from_ymd_opt(2023, 12, 25)
        .unwrap()
        .and_hms_opt(12, 0, 0)
        .unwrap();
    
    let dtf_en = DateTimeFormat::new("en-US", dt_options.clone()).unwrap();
    let dtf_es = DateTimeFormat::new("es-ES", dt_options).unwrap();
    
    println!("English date: {}", dtf_en.format(&date));
    println!("Spanish date: {}", dtf_es.format(&date));
}

示例输出:

English number: 1,234.57
French number: 1 234,57
English currency: €99.99
German currency: 99,99 €
English date: Monday, December 25, 2023
Spanish date: lunes, 25 de diciembre de 2023
回到顶部