88 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| export enum FormatType {
 | |
|   /**
 | |
|    * 金额
 | |
|    */
 | |
|   currency = 'currency',
 | |
|   /**
 | |
|    * 百分比
 | |
|    */
 | |
|   percent = 'percent',
 | |
|   /**
 | |
|    * 数量
 | |
|    */
 | |
|   quantity = 'quantity',
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * 格式化数字,支持金额、百分比、数量等
 | |
|  * @param _number 数字
 | |
|  * @param fractionDigits 保留位数
 | |
|  * @param formatType 格式化类型: 'currency' | 'percent' | 'quantity' / 金额,百分比,数量
 | |
|  * @returns 格式化后的字符串
 | |
|  */
 | |
| const format = (_number: number, fractionDigits: number, formatType: FormatType): string => {
 | |
|   const number = typeof _number === 'undefined' || Number.isNaN(_number) ? 0 : _number;
 | |
|   let style;
 | |
|   let currency;
 | |
| 
 | |
|   switch (formatType) {
 | |
|     case 'currency':
 | |
|       style = 'currency';
 | |
|       currency = 'CNY';
 | |
|       break;
 | |
|     case 'percent':
 | |
|       style = 'percent';
 | |
|       break;
 | |
|     case 'quantity':
 | |
|       style = 'decimal';
 | |
|       break;
 | |
|     default:
 | |
|       throw new Error('Invalid formatType. Supported values are "currency", "percent", and "quantity".');
 | |
|   }
 | |
|   const options = {
 | |
|     style,
 | |
|     currency,
 | |
|     minimumFractionDigits: fractionDigits,
 | |
|     maximumFractionDigits: fractionDigits,
 | |
|   };
 | |
|   const numberFormat = new Intl.NumberFormat('zh-CN', options);
 | |
|   return numberFormat.format(number);
 | |
| };
 | |
| 
 | |
| // Examples
 | |
| /**
 | |
|  * 计算金额
 | |
|  * @param number 金额
 | |
|  * @param fractionDigits 需要保留的位数
 | |
|  * @returns
 | |
|  */
 | |
| export const formatCurrency = (number: number, fractionDigits: number) =>
 | |
|   format(number, fractionDigits, FormatType.currency); // ¥10,000.00
 | |
| /**
 | |
|  *计算百分比
 | |
|  * @param number 需要转化的百分比
 | |
|  * @param fractionDigits 保留位数
 | |
|  * @returns
 | |
|  */
 | |
| export const formatPercent = (number: number, fractionDigits: number) =>
 | |
|   format(number, fractionDigits, FormatType.percent); // 75.00%
 | |
| /**
 | |
|  * 计算数量
 | |
|  * @param number 数字
 | |
|  * @param fractionDigits  需要保留的位数
 | |
|  * @returns
 | |
|  */
 | |
| export const formatQuantity = (number: number, fractionDigits = 2) =>
 | |
|   format(number, fractionDigits, FormatType.quantity); // 12,345.679
 | |
| 
 | |
| export default format;
 | |
| 
 | |
| /**
 | |
|  * 判断数字是否是整数
 | |
|  * @param num
 | |
|  * @returns
 | |
|  */
 | |
| function _isDecimal(num: number): boolean {
 | |
|   return Number.isFinite(num) && !Number.isInteger(num);
 | |
| }
 |