코드 내용 및 다운로드 주소
accounting.js 코드는 다음과 같습니다.
/*!
* 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 메소드 --- */
/**
* 문자열/문자열 배열을 가져와서 모든 서식/엉터리를 제거하고 원시 부동 소수점 값을 반환합니다.
* 별칭: Accounting.`parse(string)`
*
* 소수점은 다음에 포함되어야 합니다. 부동 소수점과 일치하는 정규식(기본값은
*accounting.settings.number.decimal)이므로 숫자가 비표준 소수점
* 구분 기호를 사용하는 경우 두 번째 인수로 제공하세요.
*
* 괄호 안의 부정어도 일치합니다(예: "$ (1.99)" => -1.99)
*
* 오류를 발생시키지 않지만(`NaN`은 0이 됨) 향후 변경될 수 있습니다
*/
var unformat = lib.unformat = lib.parse = function(value,decimal) {
// 재귀적으로 배열의 형식을 해제합니다.
if (isArray(value)) {
return map(value, function(val) {
return unformat(val,decimal);
});
}
// 자동으로 실패합니다(상당한 오류 필요):
value = value || 0;
// 이미 숫자인 경우 값을 있는 그대로 반환합니다.
if (typeof value === "number") return value;
// 기본 소수점은 설정에서 가져오지만 예를 들어 설정할 수 있습니다. "," 옵션:
십진수 = 십진수 || lib.settings.number.decimal;
// 숫자, 소수점 및 빼기 기호를 제외한 모든 것을 제거하는 정규식을 작성합니다.
var regex = new RegExp("[^0-9-"decimal "]", ["g"]),
unformatted =parseFloat(
("" value)
.replace(/((.*))/, "-$1") // 괄호 안의 값을 음수로 대체
.replace(regex, ' ') // 불필요한 부분 제거
.replace(decimal, '.') // 소수점이 표준인지 확인
);
// 이는 조용히 실패하여 문제를 일으킬 수 있습니다. 기다려 보겠습니다.
return !isNaN(unformatted) ? 포맷되지 않음 : 0;
};
/**
* 부동소수점을 소수처럼 처리하는 toFixed() 구현
*
*
에 나타나는 이진 반올림 문제(예: (0.615).toFixed(2) === "0.61")를 수정합니다. * 회계 및 재무 관련 소프트웨어에 대한 문제.
*/
var toFixed = lib.toFixed = function(값, 정밀도) {
precision = checkPrecision(precision, lib.settings.number.precision);
var power = Math.pow(10, 정밀도);
// 정밀도를 곱하고 정확하게 반올림한 다음 나누어 기본 toFixed()를 사용합니다.
return (Math.round(lib.unformat(value) * power) / power).toFixed(precision);
};
/**
* 쉼표로 구분된 천 단위 및 사용자 정의 정밀도/소수점 자릿수를 사용하여 숫자 형식 지정
*
* 정밀도 및 천 단위/소수 구분 기호를 재정의하여 현지화
* 두 번째 매개변수 `precision`은 객체일 수 있음 `settings.number`와 일치
*/
var formatNumber = lib.formatNumber = function(number, 정밀도, 천, 십진수) {
// 배열 형식을 반복적으로 지정:
if (isArray(number) ) {
return map(number, function(val) {
return formatNumber(val, 정밀도, 천, 십진수);
});
}
// 번호 정리:
number = unformat(number);
// 두 번째 매개변수(객체인 경우) 또는 모든 매개변수에서 옵션 객체를 빌드하고 기본값을 확장합니다.
var opts = defaults(
(isObject(precision) ? 정밀도 : {
정밀도 : 정밀도,
천 : 천,
십진수 : 십진수
}),
lib.settings.number
),
// 정밀도 정리
usePrecision = checkPrecision(opts.precision) ,
// 계산을 수행합니다.
음수 = 숫자 < 0? "-" : "",
base = parsInt(toFixed(Math.abs(number || 0), usePrecision), 10) "",
mod = base.length > 3? 기본.길이 % 3 : 0;
// 숫자 형식 지정:
음수 반환 (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] : "");
};
/**
* 숫자를 통화 형식으로 지정
*
* 사용법: 회계.formatMoney(number, 기호, 정밀도, 수천Sep, 소수점Sep, 형식)
* 기본값: (0, "$", 2, ",", ".", "%s%v")
*
* 기호, 정밀도, 천 단위/소수 구분 기호 및 형식을 재정의하여 현지화
* 두 번째 매개변수는 `settings와 일치하는 객체일 수 있습니다. .currency`가 가장 쉬운 방법입니다.
*
* 해야 할 일: 매개변수 정리
*/
var formatMoney = lib.formatMoney = function(숫자, 기호, 정밀도, 천, 소수, 형식) {
// 순환적으로 배열 형식 지정:
if ( isArray(number)) {
return map(number, function(val){
return formatMoney(val, 기호, 정밀도, 천, 십진수, 형식);
});
}
// 번호 정리:
number = unformat(number);
// 두 번째 매개변수(if 객체인 경우) 또는 모든 매개변수에서 옵션 객체를 빌드하고 기본값을 확장합니다.
var opts = defaults(
(isObject(symbol) ? 기호 : {
symbol : 기호,
precision : 정밀도,
thousand : 천,
decimal : 소수,
format : 형식
}),
lib.settings.currency
),
// 형식 확인(pos, neg 및 0이 포함된 개체 반환):
formats = checkCurrencyFormat(opts.format),
// 이 값에 사용할 형식을 선택하세요.
useFormat = number > 0? format.pos : 숫자 < 0? 형식.neg : 형식.제로;
// 통화 기호가 추가된 반환:
return useFormat.replace('%s', opts.symbol).replace('%v', formatNumber(Math.abs(number), checkPrecision(opts.precision) ), opts.thousand, opts.decimal));
};
/**
* 회계 열에 숫자 목록 형식 지정, 공백 채우기
* 통화 기호, 천 단위 구분 기호 및 소수 자릿수 정렬
*
* 목록은 숫자 배열이어야 함
* 두 번째 매개변수는 매개변수와 일치하는 키를 포함하는 객체일 수 있습니다.
*
* 동일한 길이의 accouting 형식의 숫자 문자열 배열을 반환합니다.
*
* NB: `white-space:pre` CSS
* 브라우저가 출력 문자열의 공백을 축소하는 것을 방지하려면 목록 컨테이너에 규칙이 필요합니다.
*/
lib.formatColumn = function(목록, 기호, 정밀도, 천, 소수, 형식) {
if (!list) return [];
// 두 번째 매개변수(if 객체인 경우) 또는 모든 매개변수에서 옵션 객체를 빌드하고 기본값을 확장합니다.
var opts = defaults(
(isObject(symbol) ? 기호 : {
symbol : 기호,
정밀도 : 정밀도,
천 : 천,
십진수 : 십진수,
형식 : 형식
}),
lib.settings.currency
),
// 형식 확인(pos, neg 및 0이 있는 개체 반환), 지금은 pos만 필요합니다:
formats = checkCurrencyFormat(opts.format),
// 문자열 시작 부분이나 통화 기호 뒤에 채울지 여부:
padAfterSymbol = format.pos.indexOf("%s") < format.pos.indexOf("%v") ? true : false,
// 열에 가장 긴 문자열 길이 값 저장:
maxLength = 0,
// 옵션에 따라 목록 형식을 지정하고 가장 긴 문자열 길이 저장:
formatted = map(list, function(val, i) {
if (isArray(val)) {
// list가 다차원 배열인 경우 열 형식을 반복적으로 지정:
return lib.formatColumn (val, opts);
} else {
// 값 정리
val = unformat(val)
// 이 값에 사용할 형식 선택(pos, neg 또는 0) ):
var useFormat = val > 0 ?formats.pos : val < 0 ?formats.neg:format.zero,
// 이 값의 형식을 지정하고 형식이 지정된 목록에 저장하세요.
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;
}
});
// 목록의 각 숫자를 채우고 숫자 열을 다시 보냅니다.
return map(formatted, function(val, i) {
// 문자열인 경우에만(중첩 배열 아님) , 이미 채워졌을 것임):
if (isString(val) && val.length < maxLength) {
// 기호 위치에 따라 기호 뒤 또는 인덱스 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;
});
};
/* --- 모듈 정의 --- */
// CommonJS에 대한 내보내기 회계. AMD 모듈로 로드되는 경우에는 그렇게 정의하십시오.
// 그렇지 않으면 전역 개체에 `accounting`을 추가하면 됩니다.
if (typeofexports !== 'undefine') {
if (typeof module !== 'undefine' && module.exports) {
내보내기 = module.exports = lib;
}
exports.accounting = lib;
} else if (typeof 정의 === 'function' && 정의.amd) {
// 라이브러리를 AMD 모듈로 반환:
define([], function() {
return lib
});
} else {
// `accounting`을 원래 값으로 복원하려면 Accounting.noConstrict를 사용하세요.
// 라이브러리의 `accounting` 객체에 대한 참조를 반환합니다.
// 예: `var number = Accounting.noCon conflict();`
lib.noConstrict = (function(oldAccounting) {
return function() {
// 루트의 `accounting` 변수 값 재설정:
root.accounting = oldAccounting;
// noConstrict 메소드 삭제:
lib.noConfluence = undefed;
// 다시 할당하려면 라이브러리 참조 반환:
return lib; >};
})(root.accounting);
// 루트(전역/창) 개체에 `fx`를 선언합니다.
root['accounting'] = lib;
}
// 루트는 브라우저에서는 `window`이고 서버에서는 `global`입니다.
}(this));
官方下载地址:https://raw.github.com/josscrowcroft/accounting.js/master/accounting.js
使用实例
formatMoney
复代码 代码如下:
formatMoney
// 기본 사용법:
accounting.formatMoney(12345678); // $12,345,678.00
// 유럽 형식(사용자 정의 기호 및 구분 기호), 옵션 개체를 두 번째 매개변수로 사용할 수도 있습니다:
accounting.formatMoney(4999.99, "?", 2, ".", ","); // ?4.999,99
// 음수 값도 형식이 잘 지정됩니다.
accounting.formatMoney(-500000, "£ ", 0); // £ -500,000
// 간단한 `format` 문자열을 사용하면 기호 위치를 제어할 수 있습니다. [%v = 값, %s = 기호]:
accounting.formatMoney(5318008, { 기호: "GBP", 형식: "%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/脚本之家下载地址
회계.js