/**
* 任何人任何机构皆可用于任何项目,此软件免费无需书面授权
* 在软件和软件的所有副本中都必须包含版权声明和软件相关注解
*
* 模块: number_
* 简述: 对浮点数进行四舍五入 以千位分隔符方式格式化一个数字
* 作者: woods zhang -> hoojar@163.com ->
* 版权: 2006-2018, 张树林 拥有此源码所有版权 (MIT许可协议)
* Copyright 2006-2018, Woods Zhang All Rights Reserved (The MIT License)
*/
#include <;
#include <;
#include <ma;
#include <;
#include <c;
static inline double intpow10(int power)
{
static const double powers[] =
{
1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7,
1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15,
1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22
};
/* Not in lookup table */
if (power < 0 || power > 22)
{
return pow, (double)power);
}
return powers[power];
}
/**
* 对浮点数进行四舍五入
*
* @param val 要处理的值
* @param dec 可选的十进制小数点后数字的数目
* @return 返回将 val 根据指定精度 precision(十进制小数点后数字的数目)进行四舍五入的结果。precision 也可以是负数或零(默认值)
*/
double php_round(double val, int dec)
{
if (dec <= 0)
{
return round(val);
}
dec = intpow10(dec);
return round(val * dec) / dec;
}
/**
* 以千位分隔符方式格式化一个数字
*
* @param haystack 执行替换字符串
* @return 执行成功后的字符串
*/
char *number_format(double d, int dec, char dec_point, char thousand_sep)
{
int point = 0;
static char fmt[50] = {0};
sprintf(fmt, "%f", php_round(d, dec));
char *str = fmt;
while (*str)
{
if (*str == '.')
{
*str = dec_point;
point = 1;
}
else if (point > 0)
{
if (point > dec)
{
*str = 0;
break;
}
point++;
}
str++;
}
point = 0;
int p = 0, i = strlen(fmt);
while (*(--str))
{
--i;
if (point > 0)
{
if (point % 3 == 0)
{
for (p = strlen(fmt); p >= i; --p)
{
*(fmt + p + 1) = *(fmt + p);
}
*(fmt + i) = thousand_sep;
}
point++;
}
else if (*str == dec_point)
{
point = 1;
}
}
return (fmt[0] == ',') ? fmt + 1 : fmt;
}
int main(void)
{
double num = 123456.4569;
printf("round dec 2 (%f): %f ", num, php_round(num, 2));
printf("round dec 3 (%f): %f ", num, php_round(num, 3));
printf("number_format: %s ", number_format(num, 2, '.', ','));
printf("number_format: %s ", number_format(num, 3, '.', ','));
return 0;
}