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


Posted in Javascript onAugust 24, 2012

代码内容及下载地址
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));

官方下载地址:https://raw.github.com/josscrowcroft/accounting.js/master/accounting.js
使用实例
formatMoney
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

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

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

官方演示实例:http://josscrowcroft.github.com/accounting.js/

三水点靠木下载地址 accounting.js

Javascript 相关文章推荐
jquery 显示*天*时*分*秒实现时间计时器
May 07 Javascript
javascript验证身份证号
Mar 03 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
Dec 13 Javascript
实例讲解jquery与json的结合
Jan 07 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
May 28 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
Jun 22 Javascript
js字符串操作总结(必看篇)
Nov 22 Javascript
通过原生JS实现为元素添加事件的方法
Nov 23 Javascript
vuejs 单文件组件.vue 文件的使用
Jul 28 Javascript
通过 JS 判断页面是否有滚动条的实现方法
Apr 05 Javascript
微信小程序实现弹出层效果
May 26 Javascript
BootStrap前端框架使用方法详解
Feb 26 Javascript
jquery动画4.升级版遮罩效果的图片走廊--带自动运行效果
Aug 24 #Javascript
jquery动画3.创建一个带遮罩效果的图片走廊
Aug 24 #Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
Aug 24 #Javascript
jquery动画1.加载指示器
Aug 24 #Javascript
基于jquery的bankInput银行卡账号格式化
Aug 22 #Javascript
javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
Aug 22 #Javascript
js选取多个或单个元素的实现代码(用class)
Aug 22 #Javascript
You might like
php下实现在指定目录搜索指定类型文件的函数
2008/10/03 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
通过js动态操作table(新增,删除相关列信息)
2012/05/23 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
自定义函数实现IE7与IE8不兼容js中trim函数的问题
2015/02/03 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
浅谈Vuex@2.3.0 中的 state 支持函数申明
2017/11/22 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
[31:47]夜魇凡尔赛茶话会 第三期01:选手知多少
2021/03/11 DOTA
Python将xml和xsl转换为html的方法
2015/03/10 Python
Django自定义认证方式用法示例
2017/06/23 Python
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Python实现点阵字体读取与转换的方法
2019/01/29 Python
8种用Python实现线性回归的方法对比详解
2019/07/10 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
纯css3实现效果超级炫的checkbox复选框和radio单选框
2014/09/01 HTML / CSS
canvas实现按住鼠标移动绘制出轨迹的示例代码
2018/02/05 HTML / CSS
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
Bose美国官网:购买Bose耳机和音箱
2019/03/10 全球购物
如何查找和删除数据库中的重复数据
2014/11/05 面试题
房地产销售员的自我评价分享
2013/12/04 职场文书
商场客服专员岗位职责
2014/06/13 职场文书
亚运会口号
2014/06/20 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
读《庄子》有感:美而不自知
2019/11/06 职场文书
Java并发编程必备之Future机制
2021/06/30 Java/Android
详解Python+OpenCV进行基础的图像操作
2022/02/15 Python