Code content and download address
accounting.js code is as follows:
/*!
* Accounting.js v0.3.2
* Copyright 2011, Joss Crowcroft
*
* MIT 라이센스에 따라 자유롭게 배포 가능.
* 회계.js의 일부는 underscore.js에서 영감을 얻었거나 차용했습니다.
*
* 전체 세부 정보 및 문서:
* http://josscrowcroft.github.com/accounting.js/
*/
(function(root, undefine) {
/* --- 설정 --- */
// 나중에 전역적으로 내보내거나 참조할 로컬 라이브러리 개체를 만듭니다.
var lib = {};// 현재 버전
lib.version = '0.3.2';
/* --- 노출된 설정 --- */
// 라이브러리의 설정 구성 개체 .
// 통화 및 숫자 형식에 대한 기본 매개변수가 포함되어 있습니다.
lib.settings = {
currency: {
symbol : "$", // 기본 통화 기호는 '$'입니다.
format : "%s%v", // 출력 제어: %s = 기호, %v = 값(객체일 수 있음, 문서 참조)
decimal : ".", // 소수점 구분 기호
thousand : " ,", // 천 단위 구분 기호
정밀도 : 2, // 소수점 자리
그룹화 : 3 // 자릿수 그룹화(아직 구현되지 않음)
},
숫자: {
정밀도 : 0 , // 숫자의 기본 정밀도는 0
그룹화 : 3, // 숫자 그룹화(아직 구현되지 않음)
thousand : ",",
decimal :
}
} ;
/* --- 내부 도우미 메서드 --- */
// 나중에 사용할 수 있는 ECMAScript 5 메서드에 대한 참조 저장
var NativeMap = Array.prototype.map,
nativeIsArray = Array .isArray,
toString = Object.prototype.toString;
/**
* 제공된 매개변수가 문자열인지 테스트합니다.
* underscore.js
*/
function isString(obj) {
return !!(obj === '' || (obj && obj.charCodeAt && obj.substr));
}
/**
* 제공된 매개변수가 underscore.js의 문자열
*인지 테스트하고 ECMA5의 기본 Array.isArray
에 위임합니다.*/
function isArray(obj) {
return NativeIsArray ? NativeIsArray(obj) : toString.call(obj) === '[객체 배열]';
}
/**
* 제공된 매개변수가 실제 객체인지 테스트합니다.
*/
function isObject(obj) {
return obj && toString.call(obj) === '[object Object]';
}
/**
* 밑줄의 _.defaults와 유사한 기본 개체로 개체를 확장합니다.
*
* API 메서드에서 매개변수 처리를 추상화하는 데 사용됩니다.
*/
function defaults(object, defs) {
var key;
객체 = 객체 || {};
defs = defs || {};
// 프로토타입이 아닌 객체 속성에 대해 반복:
for (key in defs) {
if (defs.hasOwnProperty(key)) {
// 정의되지 않은 경우에만 값을 기본값으로 바꿉니다(허용 비어 있음/0 값):
if (object[key] == null) object[key] = defs[key];
}
}
객체 반환;
}
/**
* 반복 루프를 위한 `Array.map()` 구현
*
* 각 배열 값에 대해 `iterator`를 호출한 결과로 새 배열을 반환합니다.
* 가능한 경우 기본 Array.map으로 연기
*/
function map(obj, iterator, context) {
var results = [], i, j;
if(!obj)가 결과를 반환합니다.
// 존재하는 경우 기본 .map 메서드를 사용합니다.
if (nativeMap && obj.map === NativeMap) return obj.map(iterator, context);
// 네이티브 .map에 대한 대체:
for (i = 0, j = obj.length; i < j; i ) {
results[i] = iterator.call(context, obj[ i], i, obj);
}
결과 반환;
}
/**
* 정밀도 값을 확인하고 정규화합니다(양의 정수여야 함)
*/
function checkPrecision(val, base) {
val = Math.round(Math.abs(val));
반환은 NaN(val)입니까? 베이스 : 발;
}
/**
* 형식 문자열 또는 객체를 구문 분석하고 렌더링에 사용할 형식 obj를 반환합니다.
*
* `format`은 기본(양수) 형식의 문자열이거나 `pos를 포함하는 객체
*입니다. `(필수), `neg` 및 `zero` 값(또는
* 문자열이나 객체를 반환하는 함수)
*
* string 또는 format.pos 중 하나에 "%v"(값 ) 유효
*/
function checkCurrencyFormat(format) {
var defaults = lib.settings.currency.format;
// 형식 매개변수로 함수 허용(문자열 또는 객체를 반환해야 함):
if ( typeof format === "function" ) format = format();
// 형식은 문자열일 수 있으며, 이 경우 '값'("%v")이 있어야 합니다.
if ( isString( format ) && format.match("%v") ) {
// 양수, 음수 및 0 형식을 생성하고 반환합니다.
return {
pos : format,
neg : format.replace("-", "").replace("%v", " -%v"),
zero : 형식
};
// 형식이 없거나 개체에 유효한 양수 값이 누락된 경우 기본값을 사용합니다.
} else if ( !format || !format.pos || !format.pos.match("%v") ) {
// defaults가 문자열인 경우 다음 번에 더 빠르게 확인할 수 있도록 객체로 캐스팅합니다.
return ( !isString( defaults ) ) ? defaults : lib.settings.currency.format = {
pos : 기본값,
neg : defaults.replace("%v", "-%v"),
zero : 기본값
};
}
// 그렇지 않으면 형식이 괜찮다고 가정합니다.
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