import {StringBuffer} from './StringBuffer';
import {StringUtil} from './StringUtil';
/**
* 浮点数管理类。
*
* @author maocy
* @version 150131
*/
export class FloatUtil {
// 字符串
public static Chars = '0123456789-.%';
// 数字
public static NUMBER = '0123456789-.%';
// 补齐字符串
public static PAD_CHAR = '0';
/**
* 判断内容是否为浮点数。
*
* @param value 内容
* @return 是否为浮点数
*/
public static isFloat(p) {
return StringUtil.isPattern(p, 'n');
}
/**
* 获得指定精度的四舍五入后的浮点数。
*
* @param value 内容
* @param precision 精度
* @return 浮点数
*/
public static round(value: number, precision: number = 6) {
var rate = Math.pow(10, precision);
var result = Math.round(value * rate);
return parseInt(result as any) / rate;
}
/**
* 获得指定精度的最小的浮点数。
*
* @param value 内容
* @param precision 精度
* @return 浮点数
*/
public static trunc(value: number, precision: number = 6) {
var rate = Math.pow(10, precision);
return parseInt((value * rate) as any, 10) / rate;
}
/**
* 解析字符串为浮点数。
*
* @param source 内容
* @return Number 浮点数
*/
public static parse(source) {
// 检查参数
if (source == null) {
return 0;
}
if (source == '') {
return 0;
}
// 去掉开始0字符
var value = StringUtil.trim(source.toString());
if (value == null) {
return 0;
}
while (true) {
if (value.charAt(0) != "0") {
break;
}
value = value.substr(1);
}
// 获得内容
var result = (value.length > 0) ? parseFloat(value) : 0;
// 百分比处理
if (StringUtil.findChars(result, '%') != -1) {
result = result / 100;
}
// 返回内容
return isNaN(result) ? 0 : result;
}
/**
* 格式化浮点数为指定格式。
*
* @param value 浮点数
* @param leftLength 小数点左侧位数
* @param leftPad 小数点左侧补足字符
* @param rightLength 小数点右侧位数
* @param rightPad 小数点右侧补足字符
* @return 字符串
*/
public static format(value, leftLength: number = 0, leftPad: string = null, rightLength: number = null, rightPad: string = null) {
// 检查参数
if (value == null) {
return '';
}
if (leftPad == null) {
leftPad = this.PAD_CHAR;
}
if (rightLength == null) {
rightLength = 6;
}
if (rightPad == null) {
rightPad = this.PAD_CHAR;
}
// 分割内容
var leftSource = null;
var rightSource = null;
var text = value.toString();
var index = text.indexOf('.');
if (index == -1) {
leftSource = text;
rightSource = '';
} else {
leftSource = text.substring(0, index);
rightSource = text.substring(index + 1, index + rightLength + 1);
}
var left = StringUtil.lpad(leftSource, leftLength, leftPad);
var right = StringUtil.rpad(rightSource, rightLength, rightPad);
return left + '.' + right;
}
/**
* 格式化浮点数为指定格式字符串。
*
* @param parttern 显示字符格式
* @param value 字符串
* @return String 字符串
*/
public static formatParttern(value, parttern) {
// 判断是否为数字
var floatVal = parseFloat(value);
if (!isNaN(floatVal) && isFinite(value)) {
var partternStr = parttern.toString();
var partternLe = partternStr.length;
var indexOf = partternStr.indexOf(".");
var after = partternLe - indexOf - 1;
var str = '';
var string = null;
var round = Math.round(floatVal * Math.pow(10, after)) / Math.pow(10, after);
var roundStr = round.toString();
var roundLe = roundStr.length;
var roundIndex = roundStr.indexOf(".");
var roundAfter = roundLe - roundIndex - 1;
var poor = after - roundAfter;
if (indexOf != -1) {
if (roundIndex == -1) {
for (var i = 0; i < after; i++) {
str += '0';
}
string = round + '.' + str;
} else {
if (after == roundAfter) {
string = round;
} else {
for (var i = 0; i < poor; i++) {
str += '0';
}
string = round + str;
}
}
} else {
string = Math.round(round);
}
return string;
}
}
//===========================================================
// 格式化浮点数为指定格式。
//
// @method
// @param v:value:Number 浮点数
// @param l:leftLength:Number 小数点左侧位数
// @param lp:leftPad:String 小数点左侧补足字符
// @param r:rightLength:Number 小数点右侧位数
// @param rp:rightPad:String 小数点右侧补足字符
// @param divide:rightPad:Number 除数
// @param unit:rightPad:String 单位
// @return String 浮点数
//===========================================================
public static unitFormat(v, l, lp, r, rp, divide, unit) {
var o = this;
// 校正参数
if (l == null) {
l = 0;
}
if (lp == null) {
lp = o.PAD_CHAR;
}
if (r == null) {
r = 6;
}
if (rp == null) {
rp = o.PAD_CHAR;
}
if (divide == null || unit == null) {
divide = 1;
unit = '';
}
v /= divide;
// 分割内容
var s = v.toString();
var f = s.indexOf('.');
var sr = '';
if (f == -1) {
var sl = s;
} else {
var sl = s.substring(0, f);
sr = s.substring(f + 1, f + r + 1);
}
var fl = StringUtil.lpad(sl, l, lp);
var flc: StringBuffer = new StringBuffer();
//插入逗号
for (var i = 1; i - 1 < fl.length; i++) {
flc.append(fl.substring(i - 1, i));
if (fl.length - i > 0 && (fl.length - i) % 3 == 0) {
flc.append(',');
}
}
var fr = StringUtil.rpad(sr, r, rp);
return flc + '.' + fr + unit;
}
//===========================================================
// 获得非空内容。
//
// @method
// @param v:value:Number 浮点数
// @param d:default:Number 缺省浮点数
// @return Number 浮点数
//===========================================================
public static nvl(v: number, d: number = 0) {
return v ? v : (d ? d : 0);
}
//===========================================================
// 获得范围内浮点数。
//
// @method
// @param v:value:Number 浮点数
// @param i:min:Number 最小浮点数
// @param a:max:Number 最大浮点数
// @return Number 浮点数
//===========================================================
public static toRange(v, i, a) {
if (v == null) {
v = 0;
}
return Math.min(Math.max(v, i), a);
}
//===========================================================
// 计算所有参数的浮点数之和。
//
// @method
// @param p:values:Number 浮点数集合
// @return Number 浮点数
//===========================================================
public static sum() {
var a = arguments;
var r = 0;
for (var i: number = a.length - 1; i >= 0; i--) {
var v = a[i];
if (v != null) {
r += parseFloat(v);
}
}
return r;
}
//===========================================================
// 把两个字符串 进行算术运算。
//
// @method
// @param v:value:Number 浮点数
// @param d:default:Number 缺省浮点数
// @return Number 浮点数
//===========================================================
public static calculate(f: number, a: number, b: number) {
a = this.nvl(a);
b = this.nvl(b);
a = parseFloat(a as any);
b = parseFloat(b as any);
if (f) {
return (a + b).toString();
} else {
return (a - b).toString();
}
}
//===========================================================
// 接收浮点数数组。
//
// @method
// @param t:targetData:Array 目标数据
// @param s:sourceData:Array 来源数据
// @param c:count:Integer 总数
// @return 是否相等
//===========================================================
public static attach(t, s, c) {
var r = false;
for (var i = 0; i < c; i++) {
if (t[i] != s[i]) {
t[i] = s[i];
r = true;
}
}
return r;
}
//===========================================================
// 填充浮点数数组。
//
// @method
// @param d:data:Array 数据
// @param i:index:Integer 索引
// @param c:count:Integer 总数
// @param v:value:Float 数据
//===========================================================
public static fill(d, i, c, v) {
for (var n = 0; n < c; n++) {
d[i++] = v;
}
}
//===========================================================
// 复制浮点数数组。
//
// @method
// @param po:outputData:Array 输出数据
// @param poi:outputIndex:Integer 输出位置
// @param pi:inputData:Array 输入数据
// @param pii:inputIndex:Integer 输入位置
// @param pc:count:Integer 总数
//===========================================================
public static copy(po, poi, pi, pii, pc) {
for (var i = 0; i < pc; i++) {
po[poi++] = pi[pii++];
}
}
}