javascript数字格式化通用类——accounting.js使用

[b]accounting.js 是一个非常小的JavaScript方法库用于对数字,金额和货币进行格式化。并提供可选的Excel风格列渲染。它没有依赖任何JS框架。货币符号等可以按需求进行定制。[/b]


accounting.js代码如下:

/*!
* accounting.js v0.3.2
* Copyright 2011, Joss Crowcroft
*
* Freely distributable under the MIT license.
* Portions of accounting.js are inspired or borrowed from underscore.js
*
* Full details and documentation:
* http://josscrowcroft.github.com/accounting.js/
*/

(function(root, undefined) {

/* --- Setup --- */

// Create the local library object, to be exported or referenced globally later
var lib = {};

// Current version
lib.version = '0.3.2';


/* --- Exposed settings --- */

// The library's settings configuration object. Contains default parameters for
// currency and number formatting
lib.settings = {
currency: {
symbol : "$", // default currency symbol is '$'
format : "%s%v", // controls output: %s = symbol, %v = value (can be object, see docs)
decimal : ".", // decimal point separator
thousand : ",", // thousands separator
precision : 2, // decimal places
grouping : 3 // digit grouping (not implemented yet)
},
number: {
precision : 0, // default precision on numbers is 0
grouping : 3, // digit grouping (not implemented yet)
thousand : ",",
decimal : "."
}
};


/* --- Internal Helper Methods --- */

// Store reference to possibly-available ECMAScript 5 methods for later
var nativeMap = Array.prototype.map,
nativeIsArray = Array.isArray,
toString = Object.prototype.toString;

/**
* Tests whether supplied parameter is a string
* from underscore.js
*/
function isString(obj) {
return !!(obj === '' || (obj && obj.charCodeAt && obj.substr));
}

/**
* Tests whether supplied parameter is a string
* from underscore.js, delegates to ECMA5's native Array.isArray
*/
function isArray(obj) {
return nativeIsArray ? nativeIsArray(obj) : toString.call(obj) === '[object Array]';
}

/**
* Tests whether supplied parameter is a true object
*/
function isObject(obj) {
return obj && toString.call(obj) === '[object Object]';
}

/**
* Extends an object with a defaults object, similar to underscore's _.defaults
*
* Used for abstracting parameter handling from API methods
*/
function defaults(object, defs) {
var key;
object = object || {};
defs = defs || {};
// Iterate over object non-prototype properties:
for (key in defs) {
if (defs.hasOwnProperty(key)) {
// Replace values with defaults only if undefined (allow empty/zero values):
if (object[key] == null) object[key] = defs[key];
}
}
return object;
}

/**
* Implementation of `Array.map()` for iteration loops
*
* Returns a new Array as a result of calling `iterator` on each array value.
* Defers to native Array.map if available
*/
function map(obj, iterator, context) {
var results = [], i, j;

if (!obj) return results;

// Use native .map method if it exists:
if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);

// Fallback for native .map:
for (i = 0, j = obj.length; i < j; i++ ) {
results[i] = iterator.call(context, obj[i], i, obj);
}
return results;
}

/**
* Check and normalise the value of precision (must be positive integer)
*/
function checkPrecision(val, base) {
val = Math.round(Math.abs(val));
return isNaN(val)? base : val;
}


/**
* Parses a format string or object and returns format obj for use in rendering
*
* `format` is either a string with the default (positive) format, or object
* containing `pos` (required), `neg` and `zero` values (or a function returning
* either a string or object)
*
* Either string or format.pos must contain "%v" (value) to be valid
*/
function checkCurrencyFormat(format) {
var defaults = lib.settings.currency.format;

// Allow function as format parameter (should return string or object):
if ( typeof format === "function" ) format = format();

// Format can be a string, in which case `value` ("%v") must be present:
if ( isString( format ) && format.match("%v") ) {

// Create and return positive, negative and zero formats:
return {
pos : format,
neg : format.replace("-", "").replace("%v", "-%v"),
zero : format
};

// If no format, or object is missing valid positive value, use defaults:
} else if ( !format || !format.pos || !format.pos.match("%v") ) {

// If defaults is a string, casts it to an object for faster checking next time:
return ( !isString( defaults ) ) ? defaults : lib.settings.currency.format = {
pos : defaults,
neg : defaults.replace("%v", "-%v"),
zero : defaults
};

}
// Otherwise, assume format was fine:
return format;
}


/* --- API Methods --- */

/**
* Takes a string/array of strings, removes all formatting/cruft and returns the raw float value
* alias: accounting.`parse(string)`
*
* Decimal must be included in the regular expression to match floats (defaults to
* accounting.settings.number.decimal), so if the number uses a non-standard decimal
* separator, provide it as the second argument.
*
* Also matches bracketed negatives (eg. "$ (1.99)" => -1.99)
*
* Doesn't throw any errors (`NaN`s become 0) but this may change in future
*/
var unformat = lib.unformat = lib.parse = function(value, decimal) {
// Recursively unformat arrays:
if (isArray(value)) {
return map(value, function(val) {
return unformat(val, decimal);
});
}

// Fails silently (need decent errors):
value = value || 0;

// Return the value as-is if it's already a number:
if (typeof value === "number") return value;

// Default decimal point comes from settings, but could be set to eg. "," in opts:
decimal = decimal || lib.settings.number.decimal;

// Build regex to strip out everything except digits, decimal point and minus sign:
var regex = new RegExp("[^0-9-" + decimal + "]", ["g"]),
unformatted = parseFloat(
("" + value)
.replace(/\((.*)\)/, "-$1") // replace bracketed values with negatives
.replace(regex, '') // strip out any cruft
.replace(decimal, '.') // make sure decimal point is standard
);

// This will fail silently which may cause trouble, let's wait and see:
return !isNaN(unformatted) ? unformatted : 0;
};


/**
* Implementation of toFixed() that treats floats more like decimals
*
* Fixes binary rounding issues (eg. (0.615).toFixed(2) === "0.61") that present
* problems for accounting- and finance-related software.
*/
var toFixed = lib.toFixed = function(value, precision) {
precision = checkPrecision(precision, lib.settings.number.precision);
var power = Math.pow(10, precision);

// Multiply up by precision, round accurately, then divide and use native toFixed():
return (Math.round(lib.unformat(value) * power) / power).toFixed(precision);
};


/**
* Format a number, with comma-separated thousands and custom precision/decimal places
*
* Localise by overriding the precision and thousand / decimal separators
* 2nd parameter `precision` can be an object matching `settings.number`
*/
var formatNumber = lib.formatNumber = function(number, precision, thousand, decimal) {
// Resursively format arrays:
if (isArray(number)) {
return map(number, function(val) {
return formatNumber(val, precision, thousand, decimal);
});
}

// Clean up number:
number = unformat(number);

// Build options object from second param (if object) or all params, extending defaults:
var opts = defaults(
(isObject(precision) ? precision : {
precision : precision,
thousand : thousand,
decimal : decimal
}),
lib.settings.number
),

// Clean up precision
usePrecision = checkPrecision(opts.precision),

// Do some calc:
negative = number < 0 ? "-" : "",
base = parseInt(toFixed(Math.abs(number || 0), usePrecision), 10) + "",
mod = base.length > 3 ? base.length % 3 : 0;

// Format the number:
return negative + (mod ? base.substr(0, mod) + opts.thousand : "") + base.substr(mod).replace(/(\d{3})(?=\d)/g, "$1" + opts.thousand) + (usePrecision ? opts.decimal + toFixed(Math.abs(number), usePrecision).split('.')[1] : "");
};


/**
* Format a number into currency
*
* Usage: accounting.formatMoney(number, symbol, precision, thousandsSep, decimalSep, format)
* defaults: (0, "$", 2, ",", ".", "%s%v")
*
* Localise by overriding the symbol, precision, thousand / decimal separators and format
* Second param can be an object matching `settings.currency` which is the easiest way.
*
* To do: tidy up the parameters
*/
var formatMoney = lib.formatMoney = function(number, symbol, precision, thousand, decimal, format) {
// Resursively format arrays:
if (isArray(number)) {
return map(number, function(val){
return formatMoney(val, symbol, precision, thousand, decimal, format);
});
}

// Clean up number:
number = unformat(number);

// Build options object from second param (if object) or all params, extending defaults:
var opts = defaults(
(isObject(symbol) ? symbol : {
symbol : symbol,
precision : precision,
thousand : thousand,
decimal : decimal,
format : format
}),
lib.settings.currency
),

// Check format (returns object with pos, neg and zero):
formats = checkCurrencyFormat(opts.format),

// Choose which format to use for this value:
useFormat = number > 0 ? formats.pos : number < 0 ? formats.neg : formats.zero;

// Return with currency symbol added:
return useFormat.replace('%s', opts.symbol).replace('%v', formatNumber(Math.abs(number), checkPrecision(opts.precision), opts.thousand, opts.decimal));
};


/**
* Format a list of numbers into an accounting column, padding with whitespace
* to line up currency symbols, thousand separators and decimals places
*
* List should be an array of numbers
* Second parameter can be an object containing keys that match the params
*
* Returns array of accouting-formatted number strings of same length
*
* NB: `white-space:pre` CSS rule is required on the list container to prevent
* browsers from collapsing the whitespace in the output strings.
*/
lib.formatColumn = function(list, symbol, precision, thousand, decimal, format) {
if (!list) return [];

// Build options object from second param (if object) or all params, extending defaults:
var opts = defaults(
(isObject(symbol) ? symbol : {
symbol : symbol,
precision : precision,
thousand : thousand,
decimal : decimal,
format : format
}),
lib.settings.currency
),

// Check format (returns object with pos, neg and zero), only need pos for now:
formats = checkCurrencyFormat(opts.format),

// Whether to pad at start of string or after currency symbol:
padAfterSymbol = formats.pos.indexOf("%s") < formats.pos.indexOf("%v") ? true : false,

// Store value for the length of the longest string in the column:
maxLength = 0,

// Format the list according to options, store the length of the longest string:
formatted = map(list, function(val, i) {
if (isArray(val)) {
// Recursively format columns if list is a multi-dimensional array:
return lib.formatColumn(val, opts);
} else {
// Clean up the value
val = unformat(val);

// Choose which format to use for this value (pos, neg or zero):
var useFormat = val > 0 ? formats.pos : val < 0 ? formats.neg : formats.zero,

// Format this value, push into formatted list and save the length:
fVal = useFormat.replace('%s', opts.symbol).replace('%v', formatNumber(Math.abs(val), checkPrecision(opts.precision), opts.thousand, opts.decimal));

if (fVal.length > maxLength) maxLength = fVal.length;
return fVal;
}
});

// Pad each number in the list and send back the column of numbers:
return map(formatted, function(val, i) {
// Only if this is a string (not a nested array, which would have already been padded):
if (isString(val) && val.length < maxLength) {
// Depending on symbol position, pad after symbol or at index 0:
return padAfterSymbol ? val.replace(opts.symbol, opts.symbol+(new Array(maxLength - val.length + 1).join(" "))) : (new Array(maxLength - val.length + 1).join(" ")) + val;
}
return val;
});
};


/* --- Module Definition --- */

// Export accounting for CommonJS. If being loaded as an AMD module, define it as such.
// Otherwise, just add `accounting` to the global object
if (typeof exports !== 'undefined') {
if (typeof module !== 'undefined' && module.exports) {
exports = module.exports = lib;
}
exports.accounting = lib;
} else if (typeof define === 'function' && define.amd) {
// Return the library as an AMD module:
define([], function() {
return lib;
});
} else {
// Use accounting.noConflict to restore `accounting` back to its original value.
// Returns a reference to the library's `accounting` object;
// e.g. `var numbers = accounting.noConflict();`
lib.noConflict = (function(oldAccounting) {
return function() {
// Reset the value of the root's `accounting` variable:
root.accounting = oldAccounting;
// Delete the noConflict method:
lib.noConflict = undefined;
// Return reference to the library to re-assign it:
return lib;
};
})(root.accounting);

// Declare `fx` on the root (global/window) object:
root['accounting'] = lib;
}

// Root will be `window` in browser or `global` on the server:
}(this));


[color=red]formatMoney[/color]实例

formatMoney

// Default usage:
accounting.formatMoney(12345678); // $12,345,678.00

// European formatting (custom symbol and separators), could also use options object as second param:
accounting.formatMoney(4999.99, "€", 2, ".", ","); // €4.999,99

// Negative values are formatted nicely, too:
accounting.formatMoney(-500000, "£ ", 0); // £ -500,000

// Simple `format` string allows control of symbol position [%v = value, %s = symbol]:
accounting.formatMoney(5318008, { symbol: "GBP", format: "%v %s" }); // 5,318,008.00 GBP

[color=red]formatNumber[/color]实例

accounting.formatNumber(5318008); // 5,318,008
accounting.formatNumber(9876543.21, 3, " "); // 9 876 543.210


[color=red]unformat[/color]实例


accounting.unformat("£ 12,345,678.90 GBP"); // 12345678.9



官方下载地址:[url]http://josscrowcroft.github.com/accounting.js/[/url]
js版数字转千位符,通用 立即下载

相关推荐

JavaScript数字格式化函数

JavaScript数字格式化函数,很好用的

accounting.js_使用Accounting.js格式化数字

在网络上时,我们使用数字来显示未读的消息,评论,喜欢,推文和其他大量物品,而在格式化用于银行或金融机构的数字时,显示数字可能需要一些解决方法。 如果您需要数字以货币格式显示或以逗号或小数点分隔 ,那么您会喜欢使用Accounting.js ,这是一个用于货币和货币格式JavaScript库。 在本文中,我们将向您展示其一些基本功能,然后在一个实际示例中利用它来展示其工作原理。 让我们开...

cune1359的博客 1651

javascript数字格式化通用类 accounting.js使用

accounting.js 是一个非常小的JavaScript方法库用于对数字,金额和货币进行格式化。并提供可选的Excel风格列渲染。它没有依赖任何JS框架。货币符号等可以按需求进行定制

【亲测免费】 accounting.js 使用指南

accounting.js 是一个轻量级的 JavaScript 库,专为财务相关的数字格式化和货币处理设计。它提供了强大的功能,包括金额格式化、转换货币、以及会计数字的标准化显示等。这个开源项目适用于任何需要在前端精确处理财务数据的应用场景,从简单的货币显示到复杂的报表制作都能得心应手。 ## 项目快速启动 ### 安装 首先,通过npm或直接下载源码来获取accounting.js库: ...

gitblog_00563的博客 677

从AI画稿到3D虚拟时装:Illustrator与Substance 3D的服装设计工作流

本文旨在解决传统服装与纺织品设计师在产品开发流程中,面临的“2D印花图案无法直观预见3D上身效果”、“物理打样成本高昂且周期漫长”的核心痛点。我们将介绍一套纯数字化的3D可视化工作流,核心是利用 Adobe Illustrator 进行矢量印花图案创作,通过 Adobe Substance 3D Sampler 将其转化为逼真的PBR(基于物理渲染)布料材质,并最终在 Adobe Substance 3D Stager 中,将该材质应用于3D服装模型,渲染出照片级的虚拟样衣。本指南将帮助设计师以极低的成本和

Kingsdesigner的博客 1400

《玩儿起来吧》MATLAB 实时图像处理系列(一二三四)

大家学了图像处理之后,是不是就想学以致用。而要用于生活中,最好的方式就是和摄像头搭配,实现实时图像处理。今天就给大家分享MATLAB实时图像处理的基础方法,希望能帮你快速入门。

HPC_ZY 1万+

数字格式化库 accounting.js的使用说明

javascript复制下载// 使用括号表示负数// 返回 "$ (1,234.56)"

BillKu的博客 1008

STM32F407串口DMA收发实战:标准库配置与环形缓冲区实现

DMA(直接存储器访问)是嵌入式系统中提升数据传输效率的核心技术,它允许外设与内存直接交换数据而无需CPU干预。其工作原理是通过专用硬件控制器接管数据搬运任务,CPU仅需初始化传输参数即可处理其他事务,从而显著降低系统负载。这项技术的核心价值在于释放CPU算力,实现高吞吐、低延迟的实时通信,尤其适用于数据采集、工业控制和通信网关等场景。在STM32F407等ARM Cortex-M4芯片中,串口结合DMA可实现稳定的高速数据流处理。本文以STM32F407标准库为基础,深入解析USART1的DMA发送与接收

weixin_29169899的博客 321

accounting.js:轻量级JavaScript货币格式化库完全指南

想要在JavaScript项目中优雅地处理货币和数字格式化吗?accounting.js就是你的理想选择!这个轻量级JavaScript库专门用于数字、货币的解析与格式化,完全可本地化,零依赖,无论是在客户端还是服务器端都能完美运行。 ## 为什么选择accounting.js? **accounting.js** 是一个微小的JavaScript库,专门解决数字、货币的解析和格式化问题。它具

gitblog_00708的博客 721

把 ABAP Unit 测试放进本地类:让重构更安全、让测试更好找的组织方式

ABAP测试代码组织策略:单元测试与集成测试的合理存放位置 本文针对ABAP开发中测试代码组织混乱的问题,提出了一套系统化的解决方案: 单元测试应存放在被测类的本地测试include中(...CCAU或...T99),确保测试与代码同步演进且易于发现 跨对象测试(组件/集成/系统测试)应创建单独的全局测试类,并通过FOR TESTING和ABSTRACT进行防护 使用! @testing注释建立测试关系,使测试与被测对象明确关联,提高可发现性 针对不同技术栈(RAP/CAP/OData)提供了具体落地建议,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1732

前沿探索:基于强化学习的目标检测与跟踪技术及论文解析

前沿探索:基于强化学习的目标检测与跟踪技术及论文解析 ,人工智能,计算机视觉,大模型,AI,本文聚焦基于强化学习的目标检测与跟踪技术,先介绍相关技术基础,包括目标检测、跟踪及强化学习的算法等。接着阐述强化学习在目标检测与跟踪中的应用思路、框架及典型算法,解析三篇相关论文的背景、方法、实验结果。还探讨了该技术面临的样本效率、奖励函数设计等挑战,以及结合迁移学习等的未来发展方向,为该领域研究提供参考。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 11万+

accounting.js:现代前端架构中的轻量级货币格式化解决方案

在当今数字化转型浪潮中,企业级应用对财务数据处理的要求日益严格。**accounting.js**作为一款专为现代前端架构设计的轻量级JavaScript库,为技术决策者和架构师提供了零依赖、高性能的货币格式化解决方案。该库支持完全本地化,能够在React、Vue、Angular等主流框架中无缝集成,满足电商平台、金融应用和企业管理系统对货币显示的专业需求。 ## 行业痛点与解决方案定位 传统

gitblog_00831的博客 918

DeepSeek Harness 工程实践与高级特性:从测试到安全的完整指南

AI Agent 能执行命令、读写文件、自主决策,能力越强风险越大——删文件、泄密钥、死循环、竞态条件随时可能发生。本文是 DeepSeek Harness 系列第三篇,深入剖析其工程实践与高级特性:从单元测试到真实 API 冒烟测试的分层策略,拒绝 Mock 依赖、坚持"验证世界而非自我报告";从正交结果、规范化契约到 Dispose 静止的防御式编程铁律;以及跨平台多层进程沙箱、文件系统版本守卫、fail-closed 审批机制、模型编写的工作流引擎与上下文压缩等高级能力。

program哲学 208

accounting.js数组格式化:如何批量处理数字和货币数据

accounting.js是一个轻量级的JavaScript库,专门用于数字、货币和货币格式的解析和格式化。它完全可本地化,零依赖,适用于客户端和服务器端JavaScript应用。这个强大的数组格式化工具能够高效处理批量数据,让您的财务数据显示更加专业和美观。💰 ## 为什么需要数组格式化? 在日常开发中,我们经常需要处理大量的财务数据,比如: - 财务报表中的数字列表 - 电商网站的订单

gitblog_01090的博客 638

计算机视觉学习路线图:从入门到专家

计算机视觉学习路线图:从入门到专家​ ,人工智能,计算机视觉,大模型,AI,计算机视觉学习路线图从七方面展开。先强调数学基础,含线性代数、概率统计和微积分;接着介绍 Python、OpenCV 等编程语言与工具;涵盖边缘检测、特征提取等经典算法;阐述深度学习中 CNN 结构、经典模型及实现;涉及目标检测、图像分割等高级专题;包含图像分类、目标检测和人脸识别等项目实战;最后提及科研进阶的论文阅读、项目参与和论文发表,助学习者从入门到专家。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 7万+

华为OD机试真题2025双机位A卷 Python&JavaScript 实现【采购订单】

在一个采购系统中,采购申请(PR)需要经过审批后才能生成采购订单(PO)。每个PR包含商品的单价(假设相同商品的单价一定是一样的)及数量信息。系统要求对商品进行分类处理:单价高于100元的商品需要单独处理,单价低于或等于100元的相同商品可以合并到同一采购订单PO中。针对单价低于100的小额订单,如果量大可以打折购买。

MISAYAONE的博客 1461

accounting.js最佳实践:避免常见货币格式化陷阱

在当今全球化的数字应用中,货币格式化是每个开发者都会遇到的关键任务。accounting.js作为一个轻量级的JavaScript库,专门解决数字、货币和货币格式化的复杂问题。本文将揭示使用accounting.js时常见的陷阱,并提供专业的最佳实践指南,帮助您避免这些错误,确保您的财务应用始终提供准确、一致的货币显示。💰 ## 🎯 为什么需要专门的货币格式化库? 许多开发者会尝试使用原生

gitblog_01083的博客 878

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

js 数字格式化库

decimal.js 提供十进制类型的任意精度数值 官网:http://mikemcl.github.io/decimal.js/ GitHub:https://github.com/MikeMcl/decimal.js big.js 一个小型,快速,易于使用的库,用于任意精度的十进制算术 官网:http://mikemcl.github.io/big.js GitHub:https://git...

sun 1887

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

accounting.js toFixed函数:避免JavaScript浮点数精度问题的终极解决方案

JavaScript开发者在处理金融计算和货币格式化时,经常会遇到一个令人头疼的问题:浮点数精度错误。比如 `(0.615).toFixed(2)` 返回的竟然是 "0.61" 而不是预期的 "0.62"!😱 这就是为什么你需要了解 accounting.js 的 toFixed 函数——这个专门为解决JavaScript浮点数精度问题而生的终极工具。 accounting.js 是一个轻量级

gitblog_00297的博客 1037

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

accounting.js插件扩展:如何为库添加自定义格式化功能的终极指南

accounting.js是一个轻量级的JavaScript数字、货币和货币格式化库,提供强大的格式化功能。本文将为您详细介绍如何为这个优秀的库添加自定义格式化功能,让您能够完全掌控数字显示格式!💰 作为一款零依赖、完全本地化的格式化工具,accounting.js已经内置了丰富的格式化选项。但有时候您可能需要更特殊的格式化需求,这时候就需要了解如何扩展它的功能。 ## 🔧 account

gitblog_00700的博客 810

accounting.js性能优化:10个提升格式化速度的技巧

accounting.js是一个轻量级的JavaScript库,专门用于数字、货币和货币格式的解析和格式化。对于需要高效处理财务数据的开发者来说,性能优化至关重要。本文将分享10个实用的性能优化技巧,帮助你显著提升accounting.js的格式化速度。 ## 🚀 预定义配置对象 避免在每次格式化时都传递完整的配置参数,而是预先定义配置对象: ```javascript // 优化前:每次

gitblog_00470的博客 788
上一篇: 用批处理 启动Oracle服务 和 关闭Oracle服务
下一篇: 在oracle中,计算出任意日期之间的工作日天数(未考虑节假日)
java_bai
博客等级 码龄15年 0粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值