「中文數字」是中文的數字表示方式,例如「123」,可以表示為「一百二十三」。中文數字如同英文字母一樣有區分大小寫,例如「123」的中文數字小寫為「一百二十三」,大寫則為「壹佰貳拾參」。至於單位則有個、十、百、千、萬、億、兆、京等等,相同單位的數量級也並非只有一種,而是分為下數、萬進、中數和上數這主要四種系統。中文數字是老祖宗的智慧,但對於現在的數位系統來說並不怎麼合適,還是得經過轉換才行。那麼要如何使用Rust程式語言進行中文數字的轉換呢?



在進入Rust程式語言之前,先來了解一下下數、萬進、中數和上數四種進位系統。北周甄鸞所作的《五經算術》有提到:

按黃帝為法,數有十等。及其用也,乃有三焉。十等者,謂「億、兆、京、垓、秭、壤、溝、澗、正、載」也。三等者,謂「上、中、下」也。其下數者,十十變之。若言十萬曰億,十億曰兆,十兆曰京也。中數者,萬萬變之。若言萬萬曰億,萬萬億曰兆,萬萬兆曰京也。上數者,數窮則變。若言萬萬曰億,億億曰兆、兆兆曰京也。

拿「一兆」來舉例的話,下數的「一兆」對應的數值為1000000(106);中數的「一兆」對應的數值為10000000000000000(1016);上數的「一兆」對應的數值同中數的「一兆」。以「一京」來舉例的話,下數的「一京」對應的數值為107;中數的「一京」對應的數值為1016;上數的「一京」對應的數值為1032

而我們平常使用的進位系統為「萬進」,一遇到「萬」就變,因此萬進的「一兆」對應的數值為1000000000000(1012),「一京」對應的數值為1016

Chinese Number

「Chinese Number」是筆者開發的套件,提供了ChineseNumber特性,可以將Rust程式語言的所有基本數值型別都擁有轉成中文數字的能力。也提供ChineseNumberToNumber特性,讓中文數字的字串可以轉成Rust程式語言的基本數值型別。這個套件除了有支援下數、萬進、中數和上數這四種進位系統外,還支援繁體字和簡體字的大小寫。

Crates.io

Cargo.toml

chinese-number = "*"

使用方法

範例程式
use chinese_number::{ChineseCase, ChineseCountMethod, ChineseVariant, NumberToChinese, ChineseToNumber};

assert_eq!("一二三", 123i8.to_chinese_naive(ChineseVariant::Traditional, ChineseCase::Lower));

assert_eq!("壹佰貳拾參", 123i8.to_chinese(ChineseVariant::Traditional, ChineseCase::Upper, ChineseCountMethod::TenThousand).unwrap());
assert_eq!("壹佰贰拾叁", 123i8.to_chinese(ChineseVariant::Simple, ChineseCase::Upper, ChineseCountMethod::TenThousand).unwrap());

assert_eq!("一百二十三", 123i8.to_chinese(ChineseVariant::Traditional, ChineseCase::Lower, ChineseCountMethod::TenThousand).unwrap());

assert_eq!("一極二載三正四澗五溝六穰七秭八垓九京零一億二萬三千四百五十六", 1234567890123456i64.to_chinese(ChineseVariant::Traditional, ChineseCase::Lower, ChineseCountMethod::Low).unwrap());
assert_eq!("十二穰三千四百五十六秭七千八百九十垓一千二百三十四京五千六百七十八兆九千零一十二億三千四百五十六萬七千八百九十", 123456789012345678901234567890i128.to_chinese(ChineseVariant::Traditional, ChineseCase::Lower, ChineseCountMethod::TenThousand).unwrap());
assert_eq!("十二萬三千四百五十六京七千八百九十萬一千二百三十四兆五千六百七十八萬九千零一十二億三千四百五十六萬七千八百九十", 123456789012345678901234567890i128.to_chinese(ChineseVariant::Traditional, ChineseCase::Lower, ChineseCountMethod::Middle).unwrap());
assert_eq!("十二萬三千四百五十六億七千八百九十萬一千二百三十四兆五千六百七十八萬九千零一十二億三千四百五十六萬七千八百九十", 123456789012345678901234567890i128.to_chinese(ChineseVariant::Traditional, ChineseCase::Lower, ChineseCountMethod::High).unwrap());

assert_eq!("一角二分", 0.12f64.to_chinese(ChineseVariant::Traditional, ChineseCase::Lower, ChineseCountMethod::TenThousand).unwrap());

assert_eq!(123i8, "一二三".to_number_naive().unwrap());

assert_eq!(123i8, "一百二十三".to_number(ChineseCountMethod::TenThousand).unwrap());
assert_eq!(-30303i16, "負三萬零三百零三".to_number(ChineseCountMethod::TenThousand).unwrap());
assert_eq!(3212345678u32, "三十二億一千二百三十四萬五千六百七十八".to_number(ChineseCountMethod::TenThousand).unwrap());
assert_eq!(10010001001001001000u64, "一千零一京零一兆零一十億零一百萬一千".to_number(ChineseCountMethod::TenThousand).unwrap());

assert_eq!(1000000u64, "一兆".to_number(ChineseCountMethod::Low).unwrap());
assert_eq!(1000000000000u64, "一兆".to_number(ChineseCountMethod::TenThousand).unwrap());
assert_eq!(10000000000000000u64, "一兆".to_number(ChineseCountMethod::Middle).unwrap());
assert_eq!(10000000000000000u64, "一兆".to_number(ChineseCountMethod::High).unwrap());

assert_eq!(120u64, "一百二".to_number(ChineseCountMethod::TenThousand).unwrap());
assert_eq!(2300u64, "兩千三".to_number(ChineseCountMethod::TenThousand).unwrap());
assert_eq!(34000u64, "三萬四".to_number(ChineseCountMethod::TenThousand).unwrap());
assert_eq!(105000u64, "十萬五".to_number(ChineseCountMethod::TenThousand).unwrap());
assert_eq!(150000000u64, "一億五".to_number(ChineseCountMethod::TenThousand).unwrap());
無標準函式庫(No Std)

如果想要讓這個套件可以在無標準函式庫的情況下被編譯,可以關掉預設的特色。數字轉中文和中文轉數字可分別使用number-to-chinesechinese-to-number特色來啟用。

[dependencies.chinese-number]
version = "*"
default-features = false
features = ["number-to-chinese", "chinese-to-number"]