number-to-zh
TypeScript icon, indicating that this package has built-in type declarations

0.0.1 • Public • Published

Number-to-zh

NPM version Downloads License GitHub stars

阿拉伯数字转(大写,小写)简 / 繁体中文数字

Highlights

  • 📦 零依赖:无需依赖其他库或框架。
  • 📣 支持万亿和亿亿:适配简体中文特殊习惯
  • ⚙️ 支持 ESM、CJS 和 IIFE 引入:可根据项目需求选择合适的引入方式。
  • 📝 支持简体中文和繁体中文的大小写数字:满足不同语境下的需求。
  • 🔢 大数支持:显示大数无精度问题,保持精确性。
  • ⭕️ 编号或是日期:提供编号与数字之间的翻译。
  • 🔧 可自定义配置:根据个人需求调整库的行为和设置。

Install

npm install number-to-zh

Usage

默认最大支持到 10^16,即千万亿,最小支持到 10^-16,如果使用万万和亿亿则没有限制。

import { numberToZh } from "number-to-zh";

numberToZh(0);                // 零
numberToZh(0.1);              // 零点一
numberToZh(-1);               // 负一
numberToZh(1e12);             // 一万亿
numberToZh(1000_0001);        // 一千万零一
numberToZh("12345678");       // 一千二百三十四万五千六百七十八

CDN

你可以借助 script 标签直接通过 CDN 来使用:

<script src="https://unpkg.com/number-to-zh/dist/number-to-zh.global.js"></script>
<script>console.log(__NUMBER_TO_ZH__.numberToZh(11));</script>

这里我们使用了 unpkg,但你也可以使用任何提供 npm 包服务的 CDN,例如 jsdelivrcdnjs。当然,你也可以下载此文件并自行提供服务。

十的口语化

「10」 读作 「一十」,但很多时候口语化读成 「十」 省略了十前面的一,可以通过 skipOneBeforeTen 参数设置:

numberToZh(10);                             // 一十
numberToZh(10, { skipOneBeforeTen: true }); // 十

繁体中文

默认使用简体小写中文,可以通过 language 指定:

numberToZh(1000_0001, { language: "zh-CN-lowercase" }); // 一千万零一
numberToZh(1000_0001, { language: "zh-CN-uppercase" }); // 壹仟万零壹
numberToZh(1000_0001, { language: "zh-TW-lowercase" }); // 一千萬零一
numberToZh(1000_0001, { language: "zh-TW-uppercase" }); // 壹仟萬零壹
numberToZh(1000_0001, { language: "zh-HK-lowercase" }); // 一千萬零一
numberToZh(1000_0001, { language: "zh-HK-uppercase" }); // 壹仟萬零壹

设置 zh-TWzh-HK 开头的语言,本质没有区别。

大数

以下内容是对简体中文的特别说明。

大数,这里指的是超过 10 千亿的数字,简体中文和繁体中文处理的逻辑不同,当数字超过万,繁体中文依然是维持四位进制,而简体中文世界采用了八位进制(破坏了分节读数法)。

根据 1984 年制定的中华人民共和国法定计量单位,十的十二次方(10^12)称为万亿,也就是说过了万之后的亿采用八位进制,即亿、十亿、百亿、千亿变成了亿、十亿、百亿、千亿、万亿、十万亿、百万亿、千万亿。

numberToZh(1_0000_0000_0000);       // 一万亿
numberToZh(1000_0000_0000_0000);    // 一千万亿

过了千万亿,单位可采用万万亿或者亿亿。

万万

默认支持:

numberToZh(1_0000_0000_0000_0000); // 一万万亿

亿亿

指定 repeatChar 的参数为——YY

numberToZh(1_0000_0000_0000_0000, { repeatChar: "YY" }); // 一亿亿

自定义数级

默认情况下,支持 10^16。

想用 「万万」 表示亿,比如四万万同胞的说法。

import { numberToZh } from "number-to-zh";

// 四万万
numberToZh(4_0000_0000, {
	language: "zh-CN-lowercase",
	magnitudeList: ["", "万", "万万"],
});

如果需要更大的单位——数级,也可以自定义。

比如根据 有关中文大数词问题的缘由和建议 的建议,简体中文数字万以上采用采用八位进制。因为万亿占用了兆,所以下一个数级是京,下面是添加对京的支持:

import { numberToZh } from "number-to-zh";

const options = {
	language: "zh-CN-lowercase",
	// repeatChar 一定是 false
	repeatChar: false,
	magnitudeList: ["", "万", "亿", "京"],
};

numberToZh("54000300020000001", options);         // 五京四千万三千亿二千万零一
numberToZh("500000004000300000000001", options);  // 五千万京四千万三千亿零一

如果简体中文数字,万以上想使用四位进制,可以用 digitsAboveTenThousand 参数实现:

import { numberToZh, RESOURCES } from "number-to-zh";

const options = {
	language: "zh-CN-lowercase",
	digitsAboveTenThousand: 4,
	magnitudeList: [...RESOURCES["zh-CN-lowercase"].magnitudeList, "京"],
};

numberToZh(1_0000_0000_0000, options);          // 一兆
numberToZh(1_0000_0000_0000_0000, options);     // 一京

繁体中文也可以在万上使用八位进制,设置 digitsAboveTenThousand 为 8 就行,也可以使用万万和亿亿,不过没啥意义。

// 一千萬億
numberToZh(1000_0000_0000_0000, {
	language: "zh-TW-lowercase",
	digitsAboveTenThousand: 8,
});

编号和日期

根据 出版物上数字用法的规定 - 中华人民共和国教育部 「〇」 仅用于编号或是日期,例如 2012 年汉字形式写为 「二〇一二」,不是 「二零一二」。

import { NumeralsConverter } from "number-to-zh";

const baseNumerals = ["〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"];
const converter = new NumeralsConverter(baseNumerals);

converter.getValueFromIndex(10_0001);	// "一〇〇〇〇一"
converter.getValueFromIndex(10_0101);	// "一〇〇一〇一"
converter.getValueFromIndex(10_1001);	// "一〇一〇〇一"
converter.getValueFromIndex(10_1010);	// "一〇一〇一〇"

converter.getIndexFromValue("一〇〇〇〇一");	// "100001"
converter.getIndexFromValue("一〇〇一〇一");	// "100101"
converter.getIndexFromValue("一〇一〇〇一");	// "101001"
converter.getIndexFromValue("一〇一〇一〇");	// "101010"

API

numberToZh(num, options?)

num

Type: number | string

需要转换的阿拉伯数字,当数字是 Number 时,需要注意 JavaScript 语言本身精度丢失问题。

options

language

Type: "zh-CN-lowercase" | "zh-CN-uppercase" | "zh-TW-lowercase" | "zh-TW-uppercase" | "zh-HK-lowercase" | "zh-HK-uppercase"
Default: "zh-CN-lowercase"

阿拉伯数字转为对应的中文数字,HK 和 TW 没有区别都表示繁体中文。

skipOneBeforeTen

Type: boolean
Default: false

控制一十是否读作十。

repeatChar

Type: false | "WW" | "YY"
Default: "WW"

启用万亿情况下,重复的数级,WW 表示万万,YY 表示亿亿, false 表示万亿之后正常进入下一个数级。

digitsAboveTenThousand

Type: 4 | "Quaternary" | 8 | "Octal"

万位以上的进制,简体中文默认 8,繁体中文默认 4。

numericUnderscores

Type: string
Default: _

字符串数字中支持原生数字分节。

digitsList

Type: string[]
Default: ["", "十", "百", "千"]

对应语言的数位列表。

magnitudeList

Type: string[]
Default: ["", "万", "亿", "兆"]

对应语言的数级列表。

baseNumerals

Type: string[]
Default: ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]

对应语言从零到九的中文数字列表。

minusSign

Type: string
Default:

对应语言「负」的写法。

decimalPoint

Type: string
Default:

对应语言「点」的写法。

new NumeralsConverter(array)

一个转换器,提供两个方法,用于获取数组项和数组下标的关系。

const converter = new NumeralsConverter(array);
converter.getValueFromIndex(index: number | string)

输入一系列数组下标返回数组的项。

converter.getIndexFromValue(strList: string)

输入一系列数组项返回数组下标。

Related

License

MIT License © 2023-Present Condor Hero

Package Sidebar

Install

npm i number-to-zh

Weekly Downloads

10

Version

0.0.1

License

MIT

Unpacked Size

70.7 kB

Total Files

8

Last publish

Collaborators

  • condorhero