如何在Angular或TypeScript中将数字转换为波斯语单词
Angular 实现数字转波斯语单词方案
方案1:修复现有persianjs包的TypeScript导入问题
不需要更换依赖包,手动补全类型声明即可解决报错:
- 在项目
src目录下新建persianjs.d.ts类型声明文件,写入以下内容:
declare module 'persianjs' { interface PersianJsInstance { /** 数字转波斯语单词方法 */ words(): string; /** 数字转波斯语数字字符方法 */ digits(): PersianJsInstance; } /** persianjs入口函数 */ export default function (input: string | number): PersianJsInstance; }
- 调整导入语句为默认导入格式:
import persianjs from 'persianjs';
- 如果编译仍提示导入错误,打开
tsconfig.json,在compilerOptions配置项中添加"allowSyntheticDefaultImports": true即可。 - 调用示例:
const persianText = persianjs(1372).words(); // 输出值:یک هزار و سیصد و هفتاد و دو
方案2:零依赖纯TS实现转换函数
如果不想引入第三方包,可以直接使用以下工具函数,全Angular版本通用,无类型报错:
/** * 数字转波斯语单词 * @param num 输入整数,支持0-999999999999范围 * @returns 对应波斯语单词字符串 */ export function numberToPersianWords(num: number): string { if (isNaN(num) || !isFinite(num)) return ''; if (num === 0) return 'صفر'; const ones = ['', 'یک', 'دو', 'سه', 'چهار', 'پنج', 'شش', 'هفت', 'هشت', 'نه']; const tens = ['', 'ده', 'بیست', 'سی', 'چهل', 'پنجاه', 'شصت', 'هفتاد', 'هشتاد', 'نود']; const teens = ['ده', 'یازده', 'دوازده', 'سیزده', 'چهارده', 'پانزده', 'شانزده', 'هفده', 'هجده', 'نوزده']; const hundreds = ['', 'یکصد', 'دویست', 'سیصد', 'چهارصد', 'پانصد', 'ششصد', 'هفتصد', 'هشتصد', 'نهصد']; const units = ['', 'هزار', 'میلیون', 'میلیارد']; const numberChunks: number[] = []; let positiveNum = Math.abs(Math.floor(num)); while (positiveNum > 0) { numberChunks.push(positiveNum % 1000); positiveNum = Math.floor(positiveNum / 1000); } const convertChunk = (chunk: number): string => { const parts: string[] = []; const hundred = Math.floor(chunk / 100); const ten = Math.floor((chunk % 100) / 10); const one = chunk % 10; if (hundred > 0) parts.push(hundreds[hundred]); if (ten === 1) { parts.push(teens[one]); } else { if (ten > 1) parts.push(tens[ten]); if (one > 0) parts.push(ones[one]); } return parts.join(' و '); }; const resultParts: string[] = []; for (let i = numberChunks.length - 1; i >= 0; i--) { const currentChunk = numberChunks[i]; if (currentChunk === 0) continue; let chunkText = convertChunk(currentChunk); if (i > 0) chunkText += ` ${units[i]}`; resultParts.push(chunkText); } return resultParts.join(' و '); }
调用方式非常简单,直接引入函数后传入数字即可:
const persianText = numberToPersianWords(1372); // 输出值:یک هزار و سیصد و هفتاد و دو
内容的提问来源于stack exchange,提问作者Vala Khosravi
相关产品推荐
相关产品推荐

