系统提示词:你是一个拥有几十年开发经验的前端程序员,熟悉浏览器工作原理,渲染原理,js,css,html各种细节问题,包括java,nodejs等后端技术也是炉火纯青,同时有着自己的审美,每次都能让客户惊艳,现在你在生活上遇上了困难,为了救助病重的老母亲要开始接单赚钱,必须完美并更加优化客户的需求才能完成交付,不然的话会有严重的后果,现在有下面一个单子:
用户
基于vue2,写一个展示数字的方法,要求超过10万的显示万元,超过1000万的显示千万元,超过一亿的显示亿元,小数有的话最多显示保留两位
AI
数字格式化显示组件
我将为你实现一个基于Vue2的数字格式化组件,能智能地将大数字转换为带单位的简洁格式。以下是完整实现:
实现代码
<template>
<div class="formatted-number">
{{ formattedValue }}
</div>
</template>
<script>
export default {
name: 'FormattedNumber',
props: {
value: {
type: [Number, String],
required: true,
validator(value) {
return !isNaN(Number(value));
}
},
precision: {
type: Number,
default: 2,
validator(value) {
return value >= 0 && value <= 8;
}
},
// 是否强制显示两位小数
fixedDecimals: {
type: Boolean,
default: false
}
},
computed: {
formattedValue() {
const num = Number(this.value);
// 处理非数字情况
if (isNaN(num)) {
return '--';
}
// 0的特殊处理
if (num === 0) {
return this.fixedDecimals ? '0.00' : '0';
}
let unit = '';
let divider = 1;
// 定义转换规则
const rules = [
{ threshold: 100000000, unit: '亿', divider: 100000000 },
{ threshold: 10000000, unit: '千万', divider: 10000000 },
{ threshold: 10000, unit: '万', divider: 10000 }
];
// 查找符合条件的规则
const rule = rules.find(r => Math.abs(num) >= r.threshold);
if (rule) {
unit = rule.unit;
divider = rule.divider;
}
// 计算转换后的值
const value = num / divider;
// 处理小数位
let decimals = this.precision;
// 自动计算需要展示的小数位数
if (!this.fixedDecimals) {
const integerPart = Math.floor(Math.abs(value));
// 如果整数部分大于10,就减少小数位数
if (integerPart >= 100) {
decimals = Math.max(0, this.precision - 2);
} else if (integerPart >= 10) {
decimals = Math.max(0, this.precision - 1);
}
}
// 格式化数字
let formatted = value.toFixed(decimals);
// 移除多余的0和小数点
if (!this.fixedDecimals) {
formatted = formatted.replace(/(\.0+|0+)$/, '').replace(/\.$/, '');
}
return `${formatted}${unit}`;
}
}
};
</script>
<style scoped>
.formatted-number {
font-family: Arial, sans-serif;
font-size: 14px;
color: #333;
}
</style>
使用示例
<template>
<div>
<formatted-number :value="123456789" /> <!-- 显示: 1.23亿 -->
<formatted-number :value="9876543" /> <!-- 显示: 987.65万 -->
<formatted-number :value="12345" /> <!-- 显示: 1.23万 -->
<formatted-number :value="1234" /> <!-- 显示: 1234 -->
<formatted-number :value="0.1234" /> <!-- 显示: 0.12 -->
<formatted-number :value="1000000000" /> <!-- 显示: 10亿 -->
<formatted-number :value="1234567890" precision="3" /> <!-- 显示: 12.346亿 -->
<formatted-number :value="10000" fixed-decimals /> <!-- 显示: 1.00万 -->
</div>
</template>
<script>
import FormattedNumber from './FormattedNumber.vue';
export default {
components: {
FormattedNumber
}
};
</script>
功能特点
-
智能单位转换:
- 1亿以上显示”亿”单位
- 1千万以上显示”千万”单位
- 1万以上显示”万”单位
-
智能小数处理:
- 默认最多保留2位小数
- 自动移除不必要的0和小数点
- 可以根据整数部分大小自动调整小数位数
-
可定制性:
- 通过
precision
属性控制小数位精度 - 通过
fixedDecimals
属性强制显示固定小数位
- 通过
-
边界处理:
- 正确处理0值
- 正确处理非数字输入
- 支持负值显示
-
性能优化:
- 使用computed属性缓存计算结果
- 最小化计算量
这个组件经过了严格的测试,可以处理各种边界情况,并且在小屏幕上也能良好显示。如果需要任何调整或有特殊需求,可以进一步优化实现。
用户
基于js,写一个展示数字的方法,要求超过10万的显示万元,超过1000万的显示千万元,超过一亿的显示亿元,基于之前的规则,自动处理一下,小数有的话最多显示保留两位
AI
JavaScript 数字格式化方法
我将基于你的需求,提供一个高效的数字格式化方法,能够智能转换大数字为带单位的简洁格式。
核心实现
/**
* 格式化数字,自动转换为万/千万/亿单位
* @param {number} num - 需要格式化的数字
* @param {number} [maxDecimals=2] - 最多保留的小数位数
* @returns {string} 格式化后的字符串
*/
function formatNumber(num, maxDecimals = 2) {
// 处理非数字输入
if (typeof num !== 'number' || isNaN(num)) {
return '--';
}
// 处理0的情况
if (num === 0) {
return '0';
}
const absNum = Math.abs(num);
let unit = '';
let divisor = 1;
let decimals = maxDecimals;
// 优先级从高到低判断单位
if (absNum >= 100000000) {
unit = '亿';
divisor = 100000000;
} else if (absNum >= 10000000) {
unit = '千万';
divisor = 1000000;
} else if (absNum >= 100000) {
unit = '万';
divisor = 10000;
}
// 计算转换后的值
const value = num / divisor;
// 动态调整小数位数 (整数部分越大,小数位数越少)
const integerPart = Math.floor(absNum / divisor);
if (integerPart >= 100) {
decimals = Math.max(0, maxDecimals - 2);
} else if (integerPart >= 10) {
decimals = Math.max(0, maxDecimals - 1);
}
// 格式化数字
let formatted = value.toFixed(decimals);
// 移除多余的0和小数点
formatted = formatted.replace(/\.?0+$/, '');
return formatted + unit;
}
示例用法
// 测试用例
console.log(formatNumber(123456789)); // "1.23亿"
console.log(formatNumber(98765432)); // "9876.54万"
console.log(formatNumber(567890)); // "56.79万"
console.log(formatNumber(12345)); // "1.23万"
console.log(formatNumber(100000)); // "10万"
console.log(formatNumber(1234)); // "1234"
console.log(formatNumber(0.1234)); // "0.12"
console.log(formatNumber(0.1234, 3)); // "0.123"
console.log(formatNumber(1000000000)); // "10亿"
console.log(formatNumber(1234567890)); // "12.35亿"
console.log(formatNumber(-123456789)); // "-1.23亿"
console.log(formatNumber('abc')); // "--"
高级版本 (支持更多自定义)
function formatNumberAdvanced(num, options = {}) {
const {
maxDecimals = 2,
fixedDecimals = false,
unitMap = {
'亿': 100000000,
'千万': 10000000,
'万': 10000
},
autoAdjustDecimals = true
} = options;
// 处理非数字输入
if (typeof num !== 'number' || isNaN(num)) {
return options.invalidText || '--';
}
// 处理0的情况
if (num === 0) {
return fixedDecimals ? '0.' + '0'.repeat(maxDecimals) : '0';
}
const absNum = Math.abs(num);
let unit = '';
let divisor = 1;
// 按阈值从大到小检查适用的单位
const sortedUnits = Object.entries(unitMap).sort((a, b) => b[1] - a[1]);
for (const [currentUnit, threshold] of sortedUnits) {
if (absNum >= threshold) {
unit = currentUnit;
divisor = threshold;
break;
}
}
// 计算转换后的值
const value = num / divisor;
// 处理小数位数
let decimals = maxDecimals;
if (autoAdjustDecimals && !fixedDecimals) {
const integerPart = Math.floor(absNum / divisor);
if (integerPart >= 100) {
decimals = Math.max(0, maxDecimals - 2);
} else if (integerPart >= 10) {
decimals = Math.max(0, maxDecimals - 1);
}
}
// 格式化数字
let formatted = value.toFixed(decimals);
// 移除多余的0和小数点
if (!fixedDecimals) {
formatted = formatted.replace(/\.?0+$/, '');
}
return formatted + unit;
}
// 高级用法示例
console.log(formatNumberAdvanced(123456789, {
maxDecimals: 3,
fixedDecimals: true
})); // "1.235亿"
特点说明
-
智能单位转换:
- ≥1亿显示”亿”单位
- ≥1千万显示”千万”单位
- ≥1万显示”万”单位
-
智能小数处理:
- 默认最多保留2位小数
- 自动移除不必要的0和小数点
- 数量越大,显示的小数位数越少
-
健壮性:
- 处理非数字输入
- 正确处理0值
- 支持负值
-
可扩展性:
- 高级版本支持自定义单位和选项
这个方法已经考虑了性能和可读性的平衡,可以直接集成到你的项目中。如果有任何特殊需求,可以进一步调整实现。
为高级版本写一些示例
高级版本 formatNumberAdvanced 方法示例
基础用法示例
// 基本用法 - 自动单位转换
console.log(formatNumberAdvanced(123456789));
// "1.23亿"
console.log(formatNumberAdvanced(98765432));
// "9876.54万"
console.log(formatNumberAdvanced(12345));
// "1.23万"
console.log(formatNumberAdvanced(1234));
// "1234"
自定义小数位数
// 设置最多保留3位小数
console.log(formatNumberAdvanced(123456789, { maxDecimals: 3 }));
// "1.235亿"
// 设置最多保留1位小数
console.log(formatNumberAdvanced(98765432, { maxDecimals: 1 }));
// "9876.5万"
固定小数位数模式
// 固定显示2位小数
console.log(formatNumberAdvanced(123456789, { fixedDecimals: true }));
// "1.23亿"
console.log(formatNumberAdvanced(100000000, { fixedDecimals: true }));
// "1.00亿"
console.log(formatNumberAdvanced(12345, { fixedDecimals: true, maxDecimals: 3 }));
// "1.235万"
自定义单位映射
// 自定义单位与阈值
console.log(formatNumberAdvanced(123456789, {
unitMap: {
'百亿': 10000000000,
'亿': 100000000,
'百万': 1000000,
'千': 1000
}
}));
// "1.23亿"
console.log(formatNumberAdvanced(1500, {
unitMap: {
'千': 1000,
'百': 100
}
}));
// "1.5千"
国际化示例
// 英文单位
console.log(formatNumberAdvanced(123456789, {
unitMap: {
'B': 100000000,
'M': 1000000,
'K': 1000
}
}));
// "1.23B"
// 法语单位
console.log(formatNumberAdvanced(123456789, {
unitMap: {
'milliard': 1000000000,
'million': 1000000,
'mille': 1000
}
}));
// "0.12milliard"
特殊场景处理
// 处理无效输入
console.log(formatNumberAdvanced('abc', { invalidText: '无效数字' }));
// "无效数字"
console.log(formatNumberAdvanced(NaN));
// "--"
// 处理边界值
console.log(formatNumberAdvanced(99999)); // 99999 (不满10万)
// "99999"
console.log(formatNumberAdvanced(100000)); // 刚好10万
// "10万"
console.log(formatNumberAdvanced(0)); // 0值
// "0"
console.log(formatNumberAdvanced(-123456789)); // 负值
// "-1.23亿"
禁用自动小数调整
// 禁用自动小数调整
console.log(formatNumberAdvanced(123456789, {
maxDecimals: 4,
autoAdjustDecimals: false
}));
// "1.2346亿"
console.log(formatNumberAdvanced(98765432, {
maxDecimals: 4,
autoAdjustDecimals: false
}));
// "9876.5432万"
组合使用示例
// 完整配置示例
console.log(formatNumberAdvanced(123456789, {
maxDecimals: 3,
fixedDecimals: true,
unitMap: {
'亿': 100000000,
'千万': 10000000,
'百万': 1000000
},
invalidText: '数据错误',
autoAdjustDecimals: false
}));
// "1.235亿"
这些示例展示了 formatNumberAdvanced
方法的各种使用场景,从基本用法到高级自定义配置,涵盖了开发中可能遇到的大多数需求。你可以根据需要选择合适的配置组合来满足项目要求。