将json中所有字段四舍五入保留n位小数

json中数据不规范,有时我们需要将数值(字符串类型的数值)统一保留多少位小数。

以下是我的代码,使用递归算法遍历json中所有的层。只要发现value值为浮点型或可转换成数值型的字符串则全部转换成浮点数;

具体代码如下:

class RoundJSON(object):

#data:需要处理的目标json,digit为保留多少位小数位默认保留4位

def round_data(self,data={},digit=4):#将data中的所有字段只要是数值则四舍五入,可以处理科学计数法    if(type(data)==type({})):        keys=data.keys()        if (len(keys) > 0 and type(keys)!=type(None)):            for key in keys:                value=data.get(key)                isnum=self.is_number(value)                if(isnum==True):                    value = self.roundUp(value, digit)                    data[key] = value                elif(type(value)==type({}) or type(value)==type([])):                    self.round_data(value, digit)    elif(type(data)==type([])):        for i in range(len(data)):            if (type(data[i]) == type({})):                keys = data[i].keys()                if(len(keys)>0 and type(keys)!=type(None)):                    for key in keys:                        value = data[i].get(key)                        if (self.is_number(value) == True):                            value = self.roundUp(value, digit)                            data[i][key] = value                        elif(type(value)==type({}) or type(value)==type([])):                            self.round_data(value, digit)            elif(type(data[i]) == type([]) and len(data[i])>0):                for value in data[i]:                    if (self.is_number(value) == True):                        value_new = self.roundUp(value, digit)                        data[i]=[value_new if x==value else x for x in data[i]]                    elif (type(value) == type({}) or type(value) == type([])):                        self.round_data(value, digit)            else:                if (self.is_number(data[i]) == True):                    value_new = self.roundUp(data[i], digit)                    data=[value_new if x==data[i] else x for x in data]                elif (type(data[i]) == type({}) or type(data[i]) == type([])):                    self.round_data(data[i], digit)    return data
def is_number(self,s):  #判断字符串s是否是数值    try:        float(s)        return True    except Exception as e:        pass    try:        unicodedata.numeric(s)        return True    except Exception as e:        pass    return False
def roundUp(self, value, digit):    flag = self.is_number(value)    if (flag == True and ‘e‘ not in str(value)): #排除科学计数法        result = str(value)        if (float(value) < 0):            result = result[1:]            if (result != ‘‘):                indexDec = result.find(‘.‘)                if (indexDec > 0):                    decimal = result[indexDec + 1:]                    decimalCount = len(decimal)                    if (decimalCount > digit):                        xiaoshu = result[indexDec + digit + 1]  # 第digit+1位小数                        if (int(xiaoshu) > 4):                            result = str(float(value) * -1 + pow(10, digit * -1))                            # 存在进位的可能,小数点会移位                            indexDec = result.find(‘.‘)                            result = result[:indexDec + digit + 1]                        else:                            result = result[:indexDec + digit + 1]                    else:                        lens = digit - len(result[indexDec:]) + 1                        for i in range(lens):                            result += ‘0‘            result = float(result) * -1            return result

原文地址:https://www.cnblogs.com/shuyichao/p/10450094.html

时间: 2024-10-08 22:31:26

将json中所有字段四舍五入保留n位小数的相关文章

WinCE的C#编程,对float型进行四舍五入保留两位小数,小数进行四舍五入操作,Math.Round的应用案例。

private  float ConvertFloat4Se5Ru(float flotValue) { int iValue = (int)Math.Round(flotValue * 10000); //小数点后两位前移,并四舍五入 flotValue = (float)(iValue / 10000.00f); return flotValue; } 申明:以上文字为"武汉汉码科技有限公司"原创,转载时务必注明出处. 技术分享,沟通你我,共同进步!www.hanma-scan.c

将数值四舍五入(保留2位小数)后格式化成金额形式

/** * 将数值四舍五入(保留2位小数)后格式化成金额形式 * * @param num 数值(Number或者String) * @return 金额格式的字符串,如'1,234,567.45' * @type String */function formatCurrency(num) { num = num.toString().replace(/\$|\,/g,''); if(isNaN(num)) num = "0"; sign = (num == (num = Math.a

C#四舍五入保留一位小数

DateTime d1 = hrStaff.DateJoin; DateTime d2 = DateTime.Now; TimeSpan d3 = d2.Subtract(d1); double d4 = (double)(d3.Days) / 365; //int interval = new TimeSpan(d2.Ticks - d1.Ticks).Days; 获取总共相差的天数 string str1 = d4.ToString("f1");//fN 保留N位,四舍五入 //d

java基础入门-float四舍五入保留两位小数注意的地方

float四舍五入保留两位小数注意的地方 最近在codewars做了一道非常简单的题目,但是它却花了我20来分钟,虽然最后解决了,但是中间发觉对于java的基础实在不行,回去要好好补一下 不说这么多,上题目:就是写一个方法,把英里每加仑换算成公里每升,保留两位数 一开始写的时候是没有问题,问题出现在保留两位数那里,我上一个测试代码 import java.util.regex.Pattern; public class Test { /* * 判断是否为整数 * * @param str 传入的

java 四舍五入 保留两位小数

1. 格式化字符串 1 java.text.DecimalFormat df = new java.text.DecimalFormat("#0.00"); 2 float val=Float.valueOf(df.format(6.6666666666)); 2.BigDecimal.setScale()方法 格式化小数点 1 BigDecimal bd=new BigDecimal(6.666666666666); 2 double val=bd.setScale(2,BigDec

BigDecimal四舍五入保留两位小数

import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public class NumberFormatDemo { public static void main(String[] args) { // BigDecimal // 保留两位小数 System.out.println(new BigDecimal(0.2).setScale(2, BigDecimal

java,中双精度double控制保留两位小数,js控制两位小数

Java DecimalFormat dcmFmt = new DecimalFormat("0.00"); double db = 12333.353; System.out.println(dcmFmt.format(db)); JS <script type="text/javascript"> //保留两位小数 //功能:将浮点数四舍五入,取小数点后2位 function toDecimal(x) { var f = parseFloat(x);

sql 四舍五入保留两位小数

select cast(362315*1.0/10000 as numeric(18,2)) select convert(decimal(18, 2), 362315 * 1.0 / 10000) 1. ROUND(该函数,只是负责四舍五入到两位小数,但是不负责截断 只留两位小数,例如下例:) 关于ROUND函数,我们平常理解为4舍5入,如: print ROUND(13.145, 2); 结果为:13.150 2. 使用转换类型,才能达到保留两位小数位的目的: select cast(13.

php保留两位小数并且四舍五入 保留两位小数并且不四舍五入

php保留两位小数并且四舍五入 $num = 5566.56831; echo sprintf("%.2f", $num); php保留两位小数并且不四舍五入 $num = 5566.56831; echo sprintf("%.2f",substr(sprintf("%.3f", $num), 0, -2)); php进一法取整 echo ceil(4.2); // 5 echo ceil(9.999); // 10 php舍去法取整 echo