有没有更好的方法来编写这个小代码?

时间:2017-06-20 09:06:02

标签: python optimization

我在python中处理一个具有浮动类型字段的.CSV文件。

必须修改此字段,使其至少包含4个小数点和最多8位小数点。

示例:

input: 5.15
output: 5.1500

input: -12.129999998
output: -12.12999999 

我目前正在做的事情:

#The field to be modifed is present at index 3 in list temp
dotIndex = temp[3].find('.') + 1
latLen = len(temp[3])-1

if (latLen) - (dotIndex) > 8:
    temp[3] = temp[3][0:dotIndex+4]
elif (latLen) - (dotIndex) < 4:
    temp[3] = temp[3][0:latLen] + (4 - (latLen - (dotIndex))) * '0'

有没有更好的方法来编写此代码以提高性能?

2 个答案:

答案 0 :(得分:2)

这应该有效:

temp[3] = "{:.4f}".format(float(temp[3]))

考虑到您的评论以及您希望将其截断的事实,请转到:

n = len(temp[3].split('.')[1])
if n < 4:
    temp[3] = "{:.4f}".format(float(temp[3]))
elif n > 8:
    parts = temp[3].split('.')
    temp[3] = parts[0]+"."+parts[1][:4]

答案 1 :(得分:1)

如果你是截断,而不是舍入,你可以使用这样的东西:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
   <soapenv:Header> 
      <ns1:NotifySOAPHeader xmlns:ns1="http://www.huawei.com.cn/schema/common/v2_1"> 
         <ns1:traceUniqueID>504021505821207281129180006002</ns1:traceUniqueID> 
      </ns1:NotifySOAPHeader> 
   </soapenv:Header> 
   <soapenv:Body> 
      <ns2:processRequest xmlns:ns2="http://b2b.mobilemoney.mtn.zm_v1.0/"> 
         <serviceId>101</serviceId> 
         <parameter> 
            <name>ProcessingNumber</name> 
            <value>12121212</value> 
         </parameter> 
         <parameter> 
            <name>senderID</name> 
            <value>MOM</value> 
         </parameter> 
         <parameter> 
            <name>AcctRef</name> 
            <value>112233</value> 
         </parameter> 
         <parameter> 
            <name>RequestAmount</name> 
            <value>1212</value> 
         </parameter> 
         <parameter> 
            <name>paymentRef</name> 
            <value>12121</value> 
         </parameter> 
         <parameter> 
            <name>ThirdPartyTransactionID</name> 
            <value>12112</value> 
         </parameter> 
         <parameter> 
            <name>MOMAcctNum</name> 
            <value>121212</value> 
         </parameter> 
         <parameter> 
            <name>CustName</name> 
            <value>121212</value> 
         </parameter> 
         <parameter> 
            <name>TXNType</name> 
            <value>12121</value> 
         </parameter> 
         <parameter> 
            <name>StatusCode</name> 
            <value>12121</value> 
         </parameter> 
         <parameter> 
            <name>OpCoID</name> 
            <value>0</value> 
         </parameter> 
      </ns2:processRequest> 
   </soapenv:Body> 
</soapenv:Envelope>

将10乘以8的幂,取整数部分,然后除以10得到幂8,得到所需的截断。但请注意,这将始终返回一个带有8位小数的值 - 因此5.15变为5.15000000。

你可以这样说,例如:

def truncate_to_eight(val):
    return '{:.8f}'.format((int(val * 10**8))/(10.0**8))